Dans PostgreSQL, quelle est la différence entre une instruction préparée et une fonction SQL ou PL/pgSQL, en termes de buts, avantages et inconvénients? Quand utiliserons-nous quoi?
Dans cet exemple très simple, fonctionnent-ils de la même manière, n'est-ce pas?
CREATE TABLE foo (id INT, name VARCHAR(80));
CREATE FUNCTION myfunc1(INT, VARCHAR(80)) RETURNS void AS '
INSERT INTO foo VALUES ($1, $2);
' LANGUAGE SQL;
SELECT myfunc1(3, 'ben');
CREATE FUNCTION myfunc2(INT, VARCHAR(80)) RETURNS void AS '
BEGIN
INSERT INTO foo VALUES ($1, $2);
END' LANGUAGE plpgsql;
SELECT myfunc2(3, 'ben');
PREPARE fooplan (INT, VARCHAR(80)) AS
INSERT INTO foo VALUES($1, $2);
PREPARE
EXECUTE fooplan(3, 'ben');
Tous les trois "fonctionnent de la même façon" en ce qu'ils exécutent la simple instruction SQL:
INSERT INTO foo VALUES (3, 'ben');
L'instruction préparée n'est valable que pour une instruction SQL single préparée (comme son nom l'indique). Et seulement les commandes DML. Le manuel:
Toute instruction
SELECT
,INSERT
,UPDATE
,DELETE
ouVALUES
.
Les fonctions peuvent contenir un nombre illimité d'instructions. DML et DDL. Uniquement SQL pour les fonctions SQL. Plus certains éléments procéduraux non SQL dans PL/pgSQL.
L'instruction préparée n'est visible qu'à l'intérieur de la même session et disparue à la fin de la session, tandis que les fonctions persistent et sont visibles par tous - toujours utilisables uniquement pour celles disposant du privilège EXECUTE
.
L'instruction préparée est encombrée avec le moins de frais généraux. (Pas beaucoup de différence.)
La fonction SQL est la seule des trois qui ne peut pas enregistrer le plan de requête (par elle-même). Lisez les détails sur la mise en cache du plan dans les fonctions PL/pgSQL dans le manuel ici.
La fonction SQL est également la seule qui pourrait être en ligne lorsqu'elle est utilisée dans un plus grande requête. (Pas avec un INSERT
, cependant.)
Une liste assez complète des différences entre les fonctions SQL et PL/pgSQL:
À partir de Postgres 11, il existe également des procédures SQL: