9

文档中只描述了如何更改函数定义。

但我只改变了函数体($$sql之间的文本$$)。

如何只替换这个函数体?我应该使用CREATE OR REPLACE语法来完成这个吗?

4

1 回答 1

15

是的,您可以使用CREATE FUNCTION文档中描述的 PostgresCREATE OR REPLACE FUNCTION语法更新函数的定义。

所以如果你有一个函数,你可以通过重新声明它来替换它。例如,这是我id_generator在架构更改后使用它来替换的方式:

ALTER SCHEMA public RENAME TO app;

CREATE OR REPLACE FUNCTION app.id_generator(OUT result bigint) RETURNS bigint
  LANGUAGE plpgsql
  AS $$
    DECLARE
        our_epoch bigint := 1111111111111;
        seq_id bigint;
        now_millis bigint;
        -- the id of this DB shard, must be set for each
        -- schema shard you have - you could pass this as a parameter too
        shard_id int := 1;
    BEGIN
        SELECT nextval('app.global_id_sequence') % 1024 INTO seq_id;
        SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
        result := (now_millis - our_epoch) << 23;
        result := result | (shard_id << 10);
        result := result | (seq_id);
    END;
  $$;

结果改变了函数,而不需要更新依赖函数的表。

于 2018-08-09T03:10:42.833 回答