【JPUG主催】PostgreSQLカンファレンス2020【11月13日開催】
他のバージョンの文書 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

Chapter 21. サーバープログラム開発用インターフェイス

Table of Contents
21.1. インターフェイス関数
SPI_connect — ユーザー定義のプロシージャをSPIマネージャに接続します。
SPI_finish — ユーザー定義のプロシージャをSPIマネージャから切断します。
SPI_exec — 実行計画(パーサー+プランナ+オプティマイザ)を生成し、問い合わせを実行します。
SPI_prepare — 問い合わせを実行せずに計画を準備します。
SPI_execpSPI_prepare による計画を実行します。
SPI_cursor_openSPI_prepare で作成されて計画を使用するカーソルを設定します。
SPI_cursor_find — 既存のカーソル(入口)を名前により検索します。
SPI_cursor_fetch — カーソルから数行を取り出します。
SPI_cursor_move — カーソルを移動します。
SPI_cursor_close — カーソルを閉じます。
SPI_saveplan — 渡された計画を保存します。
21.2. インタフェースサポート関数
SPI_fnumber — 指定した属性名の属性番号を検索します。
SPI_fname — 指定した属性番号の属性名を検索します。
SPI_getvalue — 指定された属性の文字列値を返します。
SPI_getbinval — 指定した属性のバイナリ値を返します。
SPI_gettype — 指定した属性の型名を返します。
SPI_gettypeid — 指定した属性の OID 型を返します。
SPI_getrelname — 指定したリレーションの名前を返します。
21.3. メモリ管理
SPI_copytuple — 上位エグゼキュータのコンテキスト内にタプルのコピーを作成します。
SPI_copytupledesc — 上位エグゼキュータのコンテキスト内にタプル記述子のコピーを作成します。
SPI_copytupleintoslot — 上位エグゼキュータ内にタプルと記述子のコピーを作成します。
SPI_modifytuple — 与えられたタプルの選択されたフィールドを置き換えたタプルを作成します。
SPI_palloc — 上位エクゼキュータのコンテキスト内にメモリを割り当てます。
SPI_repalloc — 上位エクゼキュータ内のメモリの再割り当てを行います。
SPI_pfree — 上位エグゼキュータ内のメモリを解放します。
SPI_freetuple — 上位エグゼキュータのコンテキスト内に割り当てられたタプルを解放します。
SPI_freetuptableSPI_exec や同種の関数で作成されたタプルセットを解放します。
SPI_freeplan — 以前の保存された計画を解放します。
21.4. データ変更の可視性
21.5.

Server Programming InterfaceSPI)は、ユーザー定義のC関数からSQL 問い合わせを実行する機能をユーザーに提供します。

Note: 使用可能な手続き言語(PL)は、問い合わせを実行することができる関数を構築する、別の方法を提供しています。

実際には、SPIは、パーサー、プランナ、オプティマイザ、エクゼキュータへのアクセスを単純化にするための一連の組み込み関数群に過ぎません。また、SPIはメモリ管理も行います。

誤解を防ぐために、これ以降、関数SPIインターフェイス関数の意味で、プロシージャSPIを呼び出すユーザー定義のC関数の意味で使うことにします。

SPIを使うプロシージャはエクゼキュータから呼び出されます。SPIは問い合わせを実行するためにエクゼキュータを順番に再帰的に呼び出します。エクゼキュータが再帰的に呼び出されると、それ自身でSPIを呼び出すプロシージャを呼び出す場合があります。

プロシージャの中で問い合わせを実行している最中にトランザクションが中断すると、そのプロシージャに制御が戻らないということに注意してください。それどころか、すべての実行結果がロールバックされてサーバーはクライアントからの次のコマンドを待つ状態になります。この仕様はおそらく将来の版で変更されます。

関連した制約として、(トランザクションの制御文である)BEGIN、END、ABORTができないという点があります。これも将来変更される予定です。

SPI関数は、成功すると非負の結果を(後述のように、整数値またはSPI_resultグローバル変数のどちらかを通して)返します。失敗した場合は、負またはNULLという結果を返します。

21.1. インターフェイス関数

Table of Contents
SPI_connect — ユーザー定義のプロシージャをSPIマネージャに接続します。
SPI_finish — ユーザー定義のプロシージャをSPIマネージャから切断します。
SPI_exec — 実行計画(パーサー+プランナ+オプティマイザ)を生成し、問い合わせを実行します。
SPI_prepare — 問い合わせを実行せずに計画を準備します。
SPI_execpSPI_prepare による計画を実行します。
SPI_cursor_openSPI_prepare で作成されて計画を使用するカーソルを設定します。
SPI_cursor_find — 既存のカーソル(入口)を名前により検索します。
SPI_cursor_fetch — カーソルから数行を取り出します。
SPI_cursor_move — カーソルを移動します。
SPI_cursor_close — カーソルを閉じます。
SPI_saveplan — 渡された計画を保存します。