gpt4 book ai didi

postgresql - 在数据库迁移期间更改该表后,我可以返回 'recompile' 表函数吗?

转载 作者:行者123 更新时间:2023-11-29 12:08:19 24 4
gpt4 key购买 nike

我有一个返回记录类型的存储过程。如果我更改此存储过程返回的表(假设我添加了一列),我必须断开我的数据库 session 或重新运行 CREATE OR REPLACE。如果我不这样做,我将得到错误 Wrong record type supplied in 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 - 在数据库迁移期间更改该表后,我可以返回 'recompile' 表函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com