SPI_exec

Name

SPI_exec — 创建一个执行规划 �分析器+规划器+优化器�并且执行一个查询�
SPI_exec(query, tcount)

输入

char *query

包含查询规划的字符串

int tcount

返回的最大记录数

输出

int

SPI_OK_EXEC 如果正确断开�返回此值
SPI_ERROR_UNCONNECTED 如果从一个未联接的过程调用�返回此值
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_OK_UTILITY 如果执行了某些应用�例如 CREATE TABLE ...�
SPI_OK_SELECT 如果执行了 SELECT �但不是 SELECT ... INTO��
SPI_OK_SELINTO 如果执行了 SELECT ... INTO
SPI_OK_INSERT 如果执行了 INSERT�或 INSERT ... SELECT�
SPI_OK_DELETE 如果执行了 DELETE
SPI_OK_UPDATE 如果执行了 UPDATE

描述

SPI_exec 创建一个执行规划�分析器+规划器+优化器�并且执行查询以获取 tcount 条记录�

用法

这个�函数�只能从一个已联接的过程中调用� 如果 tcount 是零则对查询扫描返回的所有记录都执行查询� 使用 tcount > 0 你可以�制查询执行的记录数�例如�

SPI_exec ("insert into table select * from table", 5);
将允许最多 5 条记录插入表中�如果你的查询执行成功则返回一个非负数�

注意: 你可能在一个字符串里传递许多查询或一个查询字符串可能被 RULE �规则�重写� SPI_exec 返回最后一个执行的查询的结果�

最后一个被执行的查询的实际记录数放在全局变量 SPI_processed 里返回 �如果不是 SPI_OK_UTILITY�� 如果返回了 SPI_OK_SELECT 而且 SPI_processed > 0 那么你可以通过全局指针 SPITupleTable *SPI_tuptable 来访问这些选出的记录� 同样要注意� SPI_finish 将释放所有 SPITupleTable 并令所有 SPITupleTable 不可用� �参阅存储器管理��

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 分配的存储器� 这些存储器不能再利用�请参考存储器管理。