SPI_exec

Name

SPI_exec -- 執行一條命令

Synopsis

int SPI_exec(const char * command, int count)

描述

SPI_exec 執行聲明的 SQL 命令獲取 count 行。

這個函數只能在已連接得過程中調用。如果 count 是零,則在命令適合的所有行上執行。 如果 count 大于 0,那麼命令執行的行數將被限制(很像一個 LIMIT 子句)。 比如,

SPI_exec("INSERT INTO tab SELECT * FROM tab", 5);

將只允許最多 5 行插入表中。

你可以在一個字串裡傳遞多個命令,並且命令可以被規則重寫。 SPI_exec 返回最後執行的命令的結果。

(最後)一條命令執行返回的結果的實際行數會放在全局的變量 SPI_processed 裡 (除非函數返回的值是 SPI_OK_UTILITY)。如果函數的返回值是 SPI_OK_SELECT, 那麼你可以使用全局指針 SPITupleTable *SPI_tuptable 訪問結果行。

結構 SPITupleTable 是這樣定義的:

typedef struct
{
    MemoryContext tuptabcxt;    /* 結果表的內存環境 */
    uint32      alloced;        /* 分配的 vals 的數目 */
    uint32      free;           /* 空閒的 vals 數目 */
    TupleDesc   tupdesc;        /* 行描述符 */
    HeapTuple  *vals;           /* 數據行 */
} SPITupleTable;

vals 是一個指向數據行的的指針數組。 (有效記錄的數目由 SPI_processed 給出)。 tupdesc 是一個行描述符,你可以傳遞給 SPI 函數處理這些數據行。 tuptabcxtalloced,和 free 是 SPI 的內部字段,並非給 SPI 調用者使用的。

SPI_finish 釋放所有在當前過程中分配的 SPITupleTables。 如果你已經處理完特定的結果表,那麼可以更早地釋放它,方法是調用 SPI_freetuptable

參數

const char * command

包含要執行的命令的字串

int count

處理或返回的最大行數

返回值

如果命令執行成功,那麼返回下列值之一(非負數):

SPI_OK_SELECT

如果執行了一個 SELECT(但不是 SELECT ... INTO

SPI_OK_SELINTO

如果執行了一條 SELECT ... INTO

SPI_OK_DELETE

如果執行了一條 DELETE

SPI_OK_INSERT

如果執行了一條 INSERT

SPI_OK_UPDATE

如果執行了一條 UPDATE

SPI_OK_UTILITY

如果執行了一條工具命令你(比如,CREATE TABLE

發生錯誤時,返回下列負數值之一:

SPI_ERROR_ARGUMENT

如果 commandNULL 或者 count 小于 0

SPI_ERROR_COPY

如果企圖進行 COPY TO stdout 或者 COPY FROM stdin

SPI_ERROR_CURSOR

如果企圖進行 DECLARECLOSE,或者 FETCH

SPI_ERROR_TRANSACTION

如果企圖進行 BEGINCOMMIT,或者 ROLLBACK

SPI_ERROR_OPUNKNOWN

命令類型未知(不應該發生)

SPI_ERROR_UNCONNECTED

如果從一個未連接的過程中調用

注意

函數 SPI_execSPI_execp, 和 SPI_prepare 修改 SPI_processedSPI_tuptable (只是一個指針,不是結構的內容)。如果你需要跨越後面的調用訪問 SPI_exec 或者 SPI_execp 的結果,那麼需要把這兩個全局倆保存到一個局部過程變量中。