我可以重新编译'在数据库迁移期间对该表进行ALTER-ed后,表返回函数?

时间:2018-04-04 14:14:48

标签: postgresql postgresql-10

我有一个返回记录类型的存储过程。如果我改变了这个存储过程返回的表(让我们说我添加一个列),我必须断开我的数据库会话或重新运行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关于迁移后运行DISCARD PLANS的建议,但不幸的是它没有帮助。

1 个答案:

答案 0 :(得分:2)

您正在寻找此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

重新联系