web-dev-qa-db-ja.com

PostgreSQLで、「ストアドプロシージャ」と他のタイプの関数の違いは何ですか?

私は以下の違いを理解しています:

  • スカラー関数
  • Set-Returning-Functions(SRF)s
  • 内部機能
  • ウィンドウ関数
  • あらゆる種類の集計関数
  • ユーザー実装関数(PostgreSQLでは任意の言語で実装できます)
  • 等。

SQL Serverでは、「ストアドプロシージャ」はEXECを通じて許可されます。 SELECTを返すNULLで実行される他の関数に比べて何が提供されますか?

PostgreSQLがストアドプロシージャを取得すると、何がもたらされますか?また、関数と仕様内のストアドプロシージャの間にある場合、正式な違いは何ですか?

私は読みます この質問ですが、実装の発表より前のようです

6
Evan Carroll

PostgresfunctionsCREATE FUNCTIONonly(単一の)トランザクションコンテキストで実行します。いくつかの重要なコマンドは関数本体内で実行されます。お気に入り CREATE DATABASEまたはCREATE INDEX CONCURRENTLYまたはVACUUMマニュアル:

VACUUMはトランザクションブロック内では実行できません。

関数は「ストアドプロシージャ」と呼ばれることが多く、これは常に誤解を招く用語でした-おそらく他のRDBMSから引き継がれています。 SQLプロシージャCREATE PROCEDURE )Postgres 11では、誤称は完全に回避されるべきです。

SQLプロシージャーは、トランザクションを開始および終了できます。 しかし、上記のコマンドはトランザクションブロック内ではまったく許可されないため、SQLプロシージャに含めることはできません(まだ)。

複数の結果セットが将来計画されていますが、まだ実装されていません。

関連:

11

PostgreSQL関数はトランザクションを開始または終了できません。呼び出し元のクエリから継承したトランザクションでスタックします。

PostgreSQLがストアドプロシージャを取得すると、トランザクションを開いたり閉じたりできるようになります。

も参照してください、

6
jjanes