SPI_exec
SPI_exec — 执行一条命令
大纲
int SPI_exec(const char *command, intcount)
描述
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 函数。tuptabcxt,alloced 和 free 是内部字段,不供 SPI 调用者使用。
SPI_finish 会释放当前过程调用期间分配的全部
SPITupleTable。如果某个结果表已经不再需要,也可以提前调用 SPI_freetuptable 释放它。
参数
const char *command包含待执行命令的字符串
intcount要处理或返回的最大行数
返回值
如果命令执行成功,则返回下列(非负)值之一:
SPI_OK_SELECT执行了
SELECT(但不是SELECT INTO)SPI_OK_SELINTO执行了
SELECT INTOSPI_OK_DELETE执行了
DELETESPI_OK_INSERT执行了
INSERTSPI_OK_UPDATE执行了
UPDATESPI_OK_UTILITY执行了工具命令(例如
CREATE TABLE)
出错时,返回以下负值之一:
SPI_ERROR_ARGUMENTcommand为NULL,或者count小于 0SPI_ERROR_COPY尝试执行了
COPY TO stdout或COPY FROM stdinSPI_ERROR_CURSOR尝试执行了
DECLARE、CLOSE或FETCHSPI_ERROR_TRANSACTION尝试执行了
BEGIN、COMMIT或ROLLBACKSPI_ERROR_OPUNKNOWN命令类型未知(理论上不应发生)
SPI_ERROR_UNCONNECTED如果从未连接的过程中调用
注解
函数 SPI_exec、SPI_execp
和 SPI_prepare 都会更改
SPI_processed 和
SPI_tuptable(只更改指针,而不更改结构体内容)。如果需要在后续调用之后继续访问 SPI_exec 或
SPI_execp 的结果,请把这两个全局变量保存到过程局部变量中。