4

J'ai essayé de simuler mon problème dans l'exemple de code ci-dessous. Dans le code ci-dessous, je fais un select * from test dans une procédure. Comme nous le savons, nous devons utiliser le mot-clé perform pour cela. Cela fonctionne très bien:Postgres plpgsql avec des requêtes PERFORM CTE

perform * from test; 

Cependant, si j'essaie de réécrire cette simple requête en CTE, je n'arrive pas à la faire fonctionner. Je reçois une erreur de syntaxe.

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

Est-ce possible? Quelle est la syntaxe correcte? J'ai essayé plusieurs alternatives et en passant par la documentation, mais sans succès jusqu'à présent.

(.. S'il vous plaît noter que ceci est juste un exemple pour expliquer mon problème, je sais que les requêtes ne font pas vraiment de sens)

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; 

Répondre

3

essayer:

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

Je ne pense vous pourriez avoir besoin d'un CTE et ignorer le résultat, mais si vous en avez besoin, penser à faire de la logique "select no return" mène à la sémantique ci-dessus. ou perform * from (CTE) ou similaire

+0

Merci. Cela fonctionne en effet. Le problème est que j'ai un peu trop abstrait. Je vais poser une nouvelle question. –

+0

Je dois attendre 90 minutes apparemment :). Je vais l'ajouter plus tard aujourd'hui. Merci encore. –

+0

Voir ici: https://stackoverflow.com/questions/44908442/postgres-plpgsql-with-perform-data-modifying-cte-queries –