2012-09-07 2 views
3

PostgreSQL: Comment différencier les procédures stockées et les fonctions table?

Dans Microsoft SQL Server, il existe des procédures stockées et des fonctions table. La différence est, à partir d'une procédure stockée, je ne peux pas faire d'autres sélections, alors que d'une fonction table, je peux.

par exemple.

SELECT * FROM sp_whatever WHERE xxx est illégal
tout
SELECT * FROM TVF_whatever WHERE xxx est parfaitement légal

Ma question:

Dans PostgreSQL, quand je regarde information_schema.routines, comment puis-je distinguer les fonctions d'une valeur de table, et les procédures?

Y a-t-il une différence?

Et en général, comment différencier les fonctions et les procédures dans PostgreSQL?

Je veux dire théoriquement, sur SQL serveur, on peut les différencier comme ceci:
fonction table: information_schema.data_type = 'table'
procédures stockées: information_schema.data_type IS NULL
Fonctions: information_schema.data_type != 'table' AND information_schema.data_type IS NOT NULL

Comment cela se fait dans Postgres? En théorie, une procédure stockée a le type de retour void, mais puisqu'une procédure stockée peut également renvoyer une table, il n'y a aucun moyen de différencier tvf et la préséance stockée - en supposant que soit une différence.

Donc, ma question pourrait également être formulée:
En PostGreSQL, comment puis-je créer une fonction de valeur table et comment puis-je créer une procédure stockée (1 exemple chacun).

Je suis intéressé par la différence de type de retour entre les deux, s'il y en a.

Répondre

3

PostgreSQL ne dispose pas de procédures réelles stockées, seulement les fonctions définies par l'utilisateur:

CREATE FUNCTION foo() RETURNS TABLE(bar INT, baz TEXT) ... 

CREATE FUNCTION bar() RETURNS BOOLEAN ... 

Vérifier type de données "record":

SELECT * FROM information_schema.routines WHERE data_type = 'record'; 
+0

Alors, vous dites, dans pgsql, une "procédure stockée" qui retourne un select est complètement équivalente à une fonction table_valued? Ou existe-t-il un moyen de définir le type de retour afin qu'il reste une table, mais ne peut pas être utilisé dans d'autres sélections et jointures, tout comme le résultat d'une procédure stockée? –

+0

Vous pouvez toujours utiliser le résultat d'une fonction dans d'autres requêtes et/ou fonctions, pas de problème du tout. –

+1

@Quandary Le dernier point que vous décrivez, où il renvoie un résultat qui ne peut pas être (directement) consommé par d'autres procs/fonctions, peut être obtenu en retournant un refcursor. Voir http://www.postgresql.org/docs/current/static/plpgsql-cursors.html. L'appelant puis 'FETCH'es du curseur pour obtenir le résultat.Honnêtement, cependant, vous devriez simplement utiliser des fonctions de retour de table, c'est-à-dire des fonctions qui retournent quelque chose SETOF. –

Questions connexes