web-dev-qa-db-fra.com

Appel de fonctions avec exec au lieu de select

Est-ce que la méthode par défaut d'appeler une fonction select * from my_function()?

Je pose la question parce que j'ai construit une fonction qui ne renvoie rien, insère simplement des données dans une table et (provenant d'un arrière-plan SQL Server), elle "semble" étrange de l'appeler avec select * from...

Je m'attendais à quelque chose comme exec my_function()

45
Diego

use PERFORM statement - http://www.postgresql.org/docs/current/static/plpgsql-statements.html

Parfois, il est utile d’évaluer une expression ou une requête SELECT tout en ignorant le résultat, par exemple lors de l’appel d’une fonction ayant des effets secondaires, mais aucune valeur de résultat utile. Pour ce faire dans PL/pgSQL, utilisez l’instruction PERFORM.

donc c'est juste

DO $$ BEGIN
    PERFORM my_function();
END $$;
46
Roman Pekar

PostgreSQL 11:

PostgreSQL 11 supporte les vraies procédures stockées comme indiqué par @AbdisamadKhalif. Ils prennent en charge le contrôle des transactions en cours de procédure.

Versions plus anciennes:

Oui, c'est la manière standard, et oui c'est bizarre.

Habituellement, vous écrivez des fonctions telles que des procédures stockées et vous les appelez avec la commande CALL ou EXECUTE. PostgreSQL ne supporte pas les vraies procédures stockées (plusieurs jeux de résultats, les transactions autonomes, etc.), cependant, uniquement les fonctions définies par l'utilisateur sql-callable .

Donc, la solution consiste à SELECT function_name() à l'aide de la syntaxe d'extension PostgreSQL qui omet que FROM ou SELECT 1 FROM function_name(); soit (un peu) plus standard.

Le pilote ODBC, le pilote JDBC, etc.) comprend la syntaxe {call func_name()} escape et la traduit automatiquement en un SELECT sous-jacent.

37
Craig Ringer

Vous utiliserez from lorsque la fonction retournera un ensemble. Si la fonction retourne void juste faire

select my_function();
22
Clodoaldo Neto