web-dev-qa-db-fra.com

PL / pgSQL effectuer vs exécuter

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);
13
Guy s

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

  1. évaluer l'expression 'create table ' || some_var || '(a int)'
  2. si 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.

19
Pavel Stehule

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)

5
Vao Tsun