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.
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? –
Vous pouvez toujours utiliser le résultat d'une fonction dans d'autres requêtes et/ou fonctions, pas de problème du tout. –
@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. –