如何替换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;
$$;
结果就地更改了函数,无需更新依赖于该函数的表。
在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;
$$;
结果就地更改了函数,无需更新依赖于该函数的表。