以下是使用游标执行查询计划的示例:
#include "postgres.h"
#include "executor/spi.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(my_function);
Datum
my_function(PG_FUNCTION_ARGS)
{
SPIPlanPtr plan;
Portal portal;
int ret;
Datum Values[2];
const char *Nulls = NULL;
/* 准备查询计划 */
plan = SPI_prepare("SELECT * FROM my_table WHERE id = $1 AND name = $2", 2, (Oid []){INT4OID, TEXTOID});
if (plan == NULL)
elog(ERROR, "SPI_prepare failed");
/* 准备参数数组 */
Values[0] = Int32GetDatum(42);
Values[1] = CStringGetTextDatum("some_name");
/* 使用 SPI_cursor_open 函数打开一个 Portal */
portal = SPI_cursor_open(NULL, plan, Values, Nulls, false);
if (portal == NULL)
elog(ERROR, "SPI_cursor_open failed");
/* 使用 SPI_cursor_fetch 函数执行查询 */
ret = SPI_cursor_fetch(portal, true, 1);
if (ret != SPI_OK_SELECT)
elog(ERROR, "SPI_cursor_fetch failed");
/* 在这里处理结果集 */
/* 关闭游标 */
SPI_cursor_close(portal);
PG_RETURN_NULL();
}
在这个例子中,SPI_prepare 函数用于准备查询计划,然后使用 SPI_cursor_open 函数打开一个 Portal,并使用 SPI_cursor_fetch 函数执行查询。查询中的 $1 和 $2 将由 Values 数组中的值替代。
请确保在使用 SPI 函数时了解 PostgreSQL 版本的特定细节,因为不同版本之间可能存在差异。
转载请注明出处:http://www.zyzy.cn/article/detail/8558/PostgreSQL