pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
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包含待执行命令的字符串
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_ARGUMENTcommand 为 NULL,或者 count 小于 0
SPI_ERROR_COPY尝试执行了 COPY TO stdout 或 COPY FROM stdin
SPI_ERROR_CURSOR尝试执行了 DECLARE、CLOSE 或 FETCH
SPI_ERROR_TRANSACTION尝试执行了 BEGIN、COMMIT 或 ROLLBACK
SPI_ERROR_OPUNKNOWN命令类型未知(理论上不应发生)
SPI_ERROR_UNCONNECTED如果从未连接的过程中调用
函数 SPI_exec、SPI_execp 和 SPI_prepare 都会更改 SPI_processed 和 SPI_tuptable(只更改指针,而不更改结构体内容)。如果 需要在后续调用之后继续访问 SPI_exec 或 SPI_execp 的结果,请把这两个全局变量保存到过程 局部变量中。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。