PostgreSQL Programmer's Guide
PrevNext

SPI_exec

Name

SPI_exec — 実行計画(parser+planner+optimizer) を生成し、問い合わせを 実行します。

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_COPYCOPY TO/FROM stdin の場合。
SPI_ERROR_CURSORDECLARE/CLOSE CURSOR, FETCH の場合。
SPI_ERROR_TRANSACTIONBEGIN/ABORT/END の場合。
SPI_ERROR_OPUNKNOWN未定義の問い合わせタイプの場合 (これはあってはなりません)。

もしも問い合わせがうまくいった場合は以下の値(非負)のうちいずれかが返ります:

SPI_OK_UTILITY ユーティリティ(たとえば CREATE TABLE)が実行された場合
SPI_OK_SELECT SELECT (ただし SELECT ... INTO 以外!)が実行された場合
SPI_OK_SELINTOSELECT ... INTO が実行された場合
SPI_OK_INSERT INSERT (もしくは INSERT ... SELECT) が実行された場合
SPI_OK_DELETE DELETE が実行された場合
SPI_OK_UPDATE UPDATE が実行された場合

説明

SPI_exec は実行プラン(parser+planner+optimizer) を生成し、tcount タプル分の 問い合わせを実行します。

使い方

この関数は接続済の手続きからのみ呼び出してください。 もしも tcount が 0 なら 問い合わせスキャンが返したすべてのタプルについて問い合わせを実行します。 tcount > 0 とすることにより 問い合わせの対象となるタプルを制限することができます。 例えば

SPI_exec ("insert into table select * from table", 5);
はたかだか 5 個のタプルをテーブルに挿入します。
SPI_exec ("insert into table select * from table", 5);
問い合わせが成功すると、非負の値が返ります。

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

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

SPI_execは以下のうちの一つの(負の)値を返します:

SPI_ERROR_ARGUMENT 問い合わせが 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 で獲得したすべてのメモリを開放します。 このメモリはもはや使うことができません!メモリ管理の項を 御覧ください。


PrevHomeNext
SPI_finishUpSPI_prepare