SPI_exec

Name

SPI_exec --  実行計画(パーサ+プランナ+オプティマイザ)を生成 し、問い合わせを実行します。

Synopsis

SPI_exec(query, tcount)

入力

char *query

問い合わせ計画を含む文字列。

int tcount

返されるタプルの最大数。

出力

int

SPI_OK_EXEC 正しく実行できた場合。
SPI_ERROR_UNCONNECTED 未接続なプロシージャから呼び出された場合。
SPI_ERROR_ARGUMENT 引数 query が NULL または tcount < 0 の場合。
SPI_ERROR_UNCONNECTED 未接続なプロシージャから呼び出された場合。
SPI_ERROR_COPY COPY TO/FROM stdin の場合。
SPI_ERROR_CURSOR DECLARE/CLOSE CURSOR, FETCH の場合。
SPI_ERROR_TRANSACTION BEGIN/ABORT/ENDの場合。
SPI_ERROR_OPUNKNOWN 未知の問い合わせタイプの場合。(これは起こるべきではありません。)

問い合わせの実行が成功した場合、以下の(負ではない)値のいずれかが返ります。

SPI_OK_UTILITY ユーティリティ(例えば CREATE TABLE ... )が実行された場合。
SPI_OK_SELECT ( SELECT ... INTO 以外!の)SELECTが実行された場合。
SPI_OK_SELINTO SELECT ... INTO が実行された場合。
SPI_OK_INSERT INSERT(または、INSERT ... SELECT)が実行された場合。
SPI_OK_DELETE DELETE が実行された場合。
SPI_OK_UPDATE UPDATE が実行された場合。

説明

SPI_exec は実行計画(パーサ+プランナ+オブティマイザ) を生成し、tcount タプルの分の問い合わせを実行します。

使用法

接続済みのプロシージャからのみこの関数を呼び出して下さい。 tcount が 0 ならば、 問い合わせスキャンが返した全てのタプルについ て問い合わせを行ないます。 tcount > 0とすることで、 問い合わせの対象となるタプルの数を制限することができます。 例えば、

SPI_exec ("insert into table select * from table", 5);
では、最大 5 個のタプルをテーブルに挿入することができます。問い合わせの実行が 成功した場合、負ではない値が返ります。

Note: 1 個の文字列の中に複数の問い合わせを入れて渡したり、RULE システムによっ て複数の問い合わせに書き換えられる可能性のある文字列を渡しても構いません。 SPI_exec は最後に実行された問い合わせの結果を返します。

実際に(最後の)問い合わせの処理対象となったタプルの数は ( SPI_OK_UTILITY でない限り) 大域変数 SPI_processed に設定されます。 もし SPI_OK_SELECT が返り、SPI_processed > 0 ならば、大域変数である SPITupleTable *SPI_tuptableというポインタを使って、 選択されたタプルにアクセスできます。また、 SPI_finish はすべての SPITupleTable を開放しますので、SPITupleTable は使用 できなくなることに注意して下さい!(メモリ管理の項を参照して下さい。)

SPI_execは次のような(負の)値を返す可能性があります。

SPI_ERROR_ARGUMENT 引数 query が NULL または tcount < 0 の場合。
SPI_ERROR_UNCONNECTED 未接続なプロシージャの場合。
SPI_ERROR_COPY COPY TO/FROM stdin の場合。
SPI_ERROR_CURSOR DECLARE/CLOSE CURSOR、FETCH の場合。
SPI_ERROR_TRANSACTION BEGIN/ABORT/END の場合。
SPI_ERROR_OPUNKNOWN 未知の問い合わせタイプの場合。(これは起こるべきではありません。)

アルゴリズム

SPI_execは以下を行います。

ユーザ定義のプロシージャを SPI マネージャから切断し、 SPI_connect を実行してからそのプロシージャが palloc を使用して 獲得したメモリを全て開放しま す。このメモリはもはや使用できません! メモリ管理の項を参照して下さい。