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 的结果,那么需要把这两个全局俩保存到一个局部过程变量中。