我可以 'recompile' table 在数据库迁移期间 table 被 ALTER 后返回函数吗?
Can I 'recompile' table returning functions after that table is ALTER-ed during database migration?
我有一个 returns 记录类型的存储过程。如果我更改 table 这个存储过程 returns(假设我添加了一个列),我必须要么断开我的数据库会话,要么重新 运行 CREATE OR REPLACE
。如果我不这样做,我会得到错误 wrong record type supplied in RETURN NEXT
.
这是一个脚本,当我在单个 psql
会话中 运行 它失败时:
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 运行ning 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
我有一个 returns 记录类型的存储过程。如果我更改 table 这个存储过程 returns(假设我添加了一个列),我必须要么断开我的数据库会话,要么重新 运行 CREATE OR REPLACE
。如果我不这样做,我会得到错误 wrong record type supplied in RETURN NEXT
.
这是一个脚本,当我在单个 psql
会话中 运行 它失败时:
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 运行ning 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