4

以下のコード例で問題をシミュレートしようとしました。以下のコードでは、手順でselect * from testを実行しています。わかっているように、これにはperformというキーワードを使用する必要があります。これはうまく動作します:PERFORM CTEクエリのPostgres plpgsql

perform * from test; 

ただし、単純なクエリをCTEとして書き直そうとすると、動作しません。私は構文エラーが発生しています。

with test_as_cte as(select * from test) perform * from test_as_cte; 

これは可能ですか?正しい構文は何ですか?私はいくつかの選択肢を試して、ドキュメントを通過しましたが、これまでのところ成功していません。

(。。私は、クエリが実際にどんな意味がありません知っている、これは私の問題を説明するためだけの例であることに注意してください)

create table test 
(
    key int primary key 
); 

create function test() returns trigger as 
$$ 
begin 
    raise notice 'hello there'; 
    -- this does work 
    perform * from test; 
    -- this doesn't work 
    with test_as_cte as(select * from test) perform * from test_as_cte; 
    return new; 
end; 
$$ 
language plpgsql; 

create trigger test after insert on test for each row execute procedure test(); 

insert into test(key) select 1; 

答えて

3

試してみてください。

perform (with test_as_cte as(select * from test) select * from test_as_cte); 

私が思うことはありませんあなたはCTEを必要とし、結果を無視するかもしれませんが、必要であれば、「選択なし戻り値」ロジックとしての実行を考えると、上記のセマンティクスにつながります。またはperform * from (CTE)またはそれに類するもの

+0

ありがとうございます。それは確かに機能します。問題は、私はあまりにも多くを抽象化したことです。私は新しい質問をします。 –

+0

私は明らかに90分待たなければなりません:)。私は今日後でそれを追加します。再度、感謝します。 –

+0

ここをクリックしてください:https://stackoverflow.com/questions/44908442/postgres-plpgsql-with-perform-data-modifying-cte-queries –