如何替换 postgresql 函数体?

Eug*_*kov 6 postgresql create-function

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

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

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

hey*_*hew 11

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

所以如果你有一个函数,你可以通过重新声明它来替换它。例如,这是我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;
  $$;
Run Code Online (Sandbox Code Playgroud)

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