厳密に言えば、Postgresにはありませんでした ストアドプロシージャ バージョン11より前のISO/IEC規格で定義されているとおりです。この用語は、機能を指すために誤って使用されることがよくあります。 、他のRDBMSが「ストアドプロシージャ」で提供するのと同じ機能(およびそれ以上)の多くを提供します。主な違いはトランザクション処理です。
- 「ストアドプロシージャ」と「ストアド関数」の違いは何ですか?
真のストアドプロシージャ ついにPostgres11で導入されました:
- ストアドプロシージャ/ユーザー定義関数をいつ使用するか?
機能 アトミック Postgresで実行され、外部トランザクション内で呼び出されない限り、独自のトランザクション内で自動的に実行されます。 これらは常に単一のトランザクション内で実行され、完全に成功または失敗します。 。 したがって、関数内でトランザクションを開始またはコミットすることはできません。そしてVACUUM
のようなコマンド 、CREATE DATABASE
、またはCREATE INDEX CONCURRENTLY
トランザクションコンテキストで実行されないものは許可されていません。
PL / pgSQLのマニュアル:
関数とトリガープロシージャは、常に外部クエリによって確立されたトランザクション内で実行されます。実行するコンテキストがないため、そのトランザクションを開始またはコミットすることはできません。ただし、
EXCEPTION
を含むブロック 句は、外部トランザクションに影響を与えることなくロールバックできるサブトランザクションを効果的に形成します。
エラー処理:
デフォルトでは、PL / pgSQL関数でエラーが発生すると、関数の実行が中止され、実際には周囲のトランザクションも中止されます。
BEGIN
を使用すると、エラーをトラップして回復できます。EXCEPTION
でブロックする 条項。
例外があります 、以下を含みますが、これらに限定されません:
- ログファイルに書き込まれるデータ
-
シーケンスに加えられた変更
重要 :一部のPostgreSQLデータ型および関数には、トランザクションの動作に関する特別なルールがあります。特に、シーケンスに加えられた変更(したがって、
serial
を使用して宣言された列のカウンター) )他のすべてのトランザクションにすぐに表示され、変更を加えたトランザクションが中止されてもロールバックされません。 -
プリペアドステートメント
- SQLFiddleデモ
-
dblink呼び出し(または同様のもの)
- Postgresはネストされたトランザクションまたは自律的なトランザクションをサポートしていますか?