postgresql - 在数据库迁移期间对表进行 ALTER 编辑后,我可以返回 'recompile' 表函数吗?

标签 postgresql postgresql-10

我有一个返回记录类型的存储过程。如果我更改此存储过程返回的表(假设我添加了一列),我必须断开数据库 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/

相关文章:

arrays - PostgreSQL 中是否有可用的多值字段类型?

sql - PostgresQL - 日期工作很奇怪

postgresql - 在 Postgresql 中创建分区表

postgresql - DBeaver + Postgres : Debug Function print to output/console

sql - PostgreSQL 10 Rowtype 功能错误?

mysql - PG::UndefinedTable: 错误:关系 'caves' 不存在

performance - 如何基于PostgreSQL表组织工作池?

sql - 计算表中出现次数的最佳方法?

postgresql - scram-sha-256 设置在 PostgreSQL 10 中使用多少次迭代?

postgresql - 使用 COPY FROM 语句时出现错误 : null value in column "field_id" violates not-null constraint