我有一个返回记录类型的存储过程。如果我更改此存储过程返回的表(假设我添加了一列),我必须断开数据库 session 或重新运行CREATE OR REPLACE
。如果不这样做,我会收到错误RETURN NEXT 中提供的记录类型错误
。
这是一个在单个 psql
session 中运行时失败的脚本:
CREATE TABLE p1(a INT, b TEXT);
CREATE OR REPLACE FUNCTION authenticate() RETURNS SETOF p1 as '
DECLARE
player_row p1;
BEGIN
-- query is more complicated but always returns zero or one rows
SELECT p.* INTO player_row
FROM p1 p;
IF FOUND THEN
RETURN NEXT player_row;
-- more code in here..
END IF;
RETURN;
END;' LANGUAGE plpgsql ROWS 1;
ALTER TABLE p1 ADD COLUMN c VARCHAR(2);
INSERT INTO p1 VALUES(1,'a', 'c');
SELECT * FROM AUTHENTICATE();
是否有 Postgres 命令或设置可以自动重新编译存储过程?我尝试了@vao-tsun 在迁移后运行DISCARD PLANS
的建议,但不幸的是它没有帮助。
最佳答案
您正在寻找此DO
语句:
CREATE TABLE p1(a INT, b TEXT);
CREATE OR REPLACE FUNCTION authenticate() RETURNS SETOF p1 as '
DECLARE
player_row p1;
BEGIN
-- query is more complicated but always returns zero or one rows
SELECT p.* INTO player_row
FROM p1 p;
IF FOUND THEN
RETURN NEXT player_row;
-- more code in here..
END IF;
RETURN;
END;' LANGUAGE plpgsql ROWS 1;
ALTER TABLE p1 ADD COLUMN c VARCHAR(2);
INSERT INTO p1 VALUES(1,'a', 'c');
do $$ begin execute pg_get_functiondef('authenticate'::regproc); end; $$;
SELECT * FROM AUTHENTICATE();
但正如 a_horse_with_no_name 所建议的,您只需 \c
即可与 psql
重新连接
关于postgresql - 在数据库迁移期间对表进行 ALTER 编辑后,我可以返回 'recompile' 表函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653371/