如何替换postgresql函数体?

How to replace postgresql function body?

DOC中只描述了如何改变函数定义。

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

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

是的,您可以使用 CREATE FUNCTION 文档中描述的 Postgres CREATE 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;
  $$;

结果就地更改了函数,无需更新依赖于该函数的表。