在 PostgreSQL 的 SPI(Server Programming Interface)库中,没有提供名为 SPI_execp 的直接函数。然而,你可以使用 SPI_cursor_open、SPI_cursor_fetch 和 SPI_cursor_close 函数来执行带有参数的查询计划,并使用游标进行操作。

以下是使用游标执行查询计划的示例:
#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