2

レコード タイプを返すストアド プロシージャがあります。このストアド プロシージャが返すテーブルを ALTER する場合 (たとえば、列を追加するとします)、データベース セッションを切断するか、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たが、残念ながら役に立ちませんでした。

4

1 に答える 1