第 41章サーバプログラミングインタフェース

目次
41.1. インタフェース関数
SPI_connect -- SPIマネージャにプロシージャを接続する
SPI_finish -- プロシージャをSPIマネージャから切断する
SPI_push -- 再帰的にSPIを使用できるようにSPIスタックをプッシュする
SPI_pop -- 再帰的なSPIの使用から復帰できるようにSPIスタックをポップする
SPI_execute -- コマンドを実行する
SPI_exec -- 読み書きコマンドを実行する
SPI_prepare -- コマンドの計画を準備する。コマンドの実行はまだ行わない
SPI_getargcount -- SPI_prepareにより準備された計画に必要とされる引数の数を返す
SPI_getargtypeid -- SPI_prepareで準備された計画で指定される引数のデータ型のOIDを返す
SPI_is_cursor_plan -- SPI_prepareで準備された計画がSPI_cursor_openで使用できる場合にtrueを返す
SPI_execute_plan -- SPI_prepareで準備された計画を実行する
SPI_execp -- 読み書きモードで計画を実行する
SPI_cursor_open -- SPI_prepareで作成された計画を使用したカーソルを設定する
SPI_cursor_find -- 既存のカーソルを名前で検索する
SPI_cursor_fetch -- カーソルから数行を取り出す
SPI_cursor_move -- カーソルを移動する
SPI_cursor_close -- カーソルを閉じる
SPI_saveplan -- 計画を保存する
41.2. インタフェースサポート関数
SPI_fname -- 指定した列番号に対する列名を決定する
SPI_fnumber -- 指定した列名から列番号を決定する
SPI_getvalue -- 指定された列の文字列値を返す
SPI_getbinval -- 指定した列のバイナリ値を返す
SPI_gettype -- 指定された列のデータ型名を返す
SPI_gettypeid -- 指定された列のデータ型のOIDを返す
SPI_getrelname -- 指定されたリレーションの名前を返す
SPI_getnspname -- 指定されたリレーションの名前空間を返す。
41.3. メモリ管理
SPI_palloc -- 上位エクゼキュータコンテキスト内にメモリを割り当てる
SPI_repalloc -- 上位エクゼキュータコンテキスト内にメモリを再割り当てる
SPI_pfree -- 上位エクゼキュータコンテキスト内のメモリを解放する
SPI_copytuple -- 上位エクゼキュータ内に行のコピーを作成する
SPI_returntuple -- Datumとしてタプルを返す準備をする
SPI_modifytuple -- 与えられた行の選択フィールドを置き換えた行を作成する
SPI_freetuple -- 上位エクゼキュータコンテキスト内に割り当てられた行を解放する
SPI_freetuptable -- SPI_executeや類似の関数によって生成された行セットを解放する
SPI_freeplan -- 以前に保存した計画を解放する
41.4. データ変更の可視性
41.5.

サーバプログラミングインタフェースSPI)は、ユーザ定義のC関数からSQL問い合わせを実行する機能をユーザに提供します。 SPIはパーサ、プランナ、オプティマイザ、エクゼキュータへのアクセスを単純化したインタフェース関数の集合です。 また、SPIは多少のメモリ管理を行います。

注意: 利用可能な手続き言語は、プロシージャからSQLコマンドを実行するための各種手段を提供します。 これらのほとんどは、SPIを元にしていますので、この文書はこれらの言語のユーザにとっても有用な場合があります。

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

コマンドがSPIの失敗を起こした場合、その制御はプロシージャには戻らないことに注意してください。 それどころか、プロシージャを実行していたトランザクションもしくは副トランザクションはロールバックされます (これはSPI関数のほとんどでエラーを返す規約があることから奇妙に思われるかもしれません。 しかし、こうした規約はSPI関数自身でエラーを検知した時にのみ適用されるものです)。 失敗する可能性があるSPI呼び出しを囲む副トランザクションを独自に用意することで、エラーの後の制御を戻すことができます。 要求される機構がまだ流動的であるため、これはまだ文書化されていません。

SPI関数は成功時に非負の結果を(戻り値、もしくは後述のSPI_resultグローバル変数の中に)返します。 エラー時、負の結果もしくはNULLを返します。

SPIを使用するソースコードファイルではexecutor/spi.hヘッダファイルをincludeしなければなりません。