Quelle est la différence entre effectuer et exécuter sur PL/pgSQL?
Du manuel:
Parfois, il est utile d'évaluer une expression ou une requête SELECT mais de rejeter le résultat, par exemple lors de l'appel d'une fonction qui a des effets secondaires mais aucune valeur de résultat utile. Pour ce faire dans PL/pgSQL, utilisez l'instruction PERFORM.
Mais quand j'essaye quelque chose comme:
perform 'create table foo as (select 1)';
Rien ne se passe. Bien que cette requête doive avoir des effets secondaires (création de table), le résultat peut être ignoré.
Je pense que je comprends bien: pour exécuter des fonctions que je peux utiliser, effectuez:
perform pg_temp.addInheritance(foo);
PERFORM
est la commande plpgsql utilisée pour les appels de fonctions void. PLpgSQL fait attention aux instructions SELECT
inutiles - la clause SELECT
sans INTO
n'est pas autorisée. Mais parfois, vous devez appeler une fonction et vous n'avez pas besoin de stocker le résultat (ou les fonctions n'ont aucun résultat). La fonction dans SQL
est appelée avec l'instruction SELECT
. Mais ce n'est pas possible dans PLpgSQL - donc la commande PERFORM
a été introduite.
CREATE OR REPLACE FUNCTION foo()
RETURNS void AS $$
BEGIN
RAISE NOTICE 'Hello from void function';
END;
$$ LANGUAGE plpgsql;
-- direct call from SQL
SELECT foo();
-- in PLpgSQL
DO $$
BEGIN
SELECT foo(); -- is not allowed
PERFORM foo(); -- is ok
END;
$$;
Les instructions PERFORM
exécutent un paramètre et ont oublié le résultat.
Votre exemple perform 'create table foo as (select 1)';
est identique à SELECT 'create table foo as (select 1)'
. Il renvoie une chaîne "create table foo as (select 1)" et cette chaîne est supprimée.
L'instruction EXECUTE
évalue une expression pour obtenir une chaîne. À l'étape suivante, cette chaîne est exécutée.
Donc EXECUTE 'create table ' || some_var || '(a int)';
a deux étapes
'create table ' || some_var || '(a int)'
some_var
est mytab par exemple, alors exécutez une commande create table mytab(a int)
L'instruction PERFORM
est utilisée pour les appels de fonction, lorsque les fonctions ne sont pas utilisées dans l'instruction d'affectation. EXECUTE
est utilisé pour l'évaluation de SQL dynamique - lorsqu'une forme de commande SQL est connue au moment de l'exécution.
Plus loin dans la ligne suivante documents que vous citez :
Cela exécute la requête et ignore le résultat. Écrivez la requête de la même manière que vous écrivez une commande SQL SELECT , mais remplacez le mot-clé initial SELECT par PERFORM.
Emphase mine
execute
exécute à son tour une requête dynamique (mêmes documents ci-dessus)