如何在PostgreSQL扩展(Apache AGE)上的C语言函数中发送SQL命令?

8aqjt8rx  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(4)|浏览(128)

我正在使用PostgreSQL扩展(Apache AGE),需要从C语言函数中执行SQL命令。如何实现?
对于上下文,我正在开发一个修改数据库中某些表的扩展,并且我需要运行一些ALTER TABLE命令来添加或删除列,重命名列或更改列类型,这取决于某些条件。我已经有一个C函数来执行必要的计算,但我不知道如何从其中执行SQL命令。
下面是我的代码的简化版本:

PG_FUNCTION_INFO_V1(my_function);

Datum
my_function(PG_FUNCTION_ARGS)
{
    // Perform some computations...

    // Execute a SQL command (not sure how to do this)...

    PG_RETURN_NULL();
}

谁能告诉我如何在PostgreSQL扩展中的C函数中执行SQL命令?任何帮助都将不胜感激!

ht4b089n

ht4b089n1#

您可以使用PostgreSQL为扩展开发人员提供的SPI(服务器编程接口)。
它是一组C语言函数和宏,提供了在PostgreSQL服务器中执行SQL命令和查询的方法。
使用SPI接口,C代码可以:

  • 准备和执行SQL语句
  • 检索和处理查询结果
  • 访问表和索引
  • 处理错误和异常

在此上下文中,ALTER TABLE函数可能如下所示:

#include "postgres.h"
#include "fmgr.h"
#include "utils/elog.h"
#include "commands/trigger.h"
#include "access/xact.h"
#include "executor/spi.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(alter_table_func);

Datum alter_table_func(PG_FUNCTION_ARGS)
{
    int ret;
    char *sql = "ALTER TABLE my_table ADD COLUMN new_column INTEGER";

    SPI_connect();
    ret = SPI_execute(sql, true, 0);
    SPI_finish();

    if (ret != SPI_OK_UTILITY)
        elog(ERROR, "ALTER TABLE failed");
    PG_RETURN_VOID();
}

你可以在这里了解更多:SPI|SPI Examples

kmpatx3s

kmpatx3s2#

您可以使用SPI(服务器编程接口)。
服务器编程接口(SPI)使用户定义的C函数的编写者能够在其函数或过程中运行SQL命令。SPI是一组接口函数,用于简化对解析器、规划器和执行器的访问。SPI还进行一些内存管理。
示例:https://www.postgresql.org/docs/current/spi-examples.html

wqsoz72f

wqsoz72f3#

你可以通过使用服务器编程接口(SPI)在C函数代码中运行sql语句。我建议你阅读更多关于它的内容here,以确切地了解你需要什么来使你的代码工作。

0ejtzxu1

0ejtzxu14#

可以通过PostgreSQL提供的服务器编程接口来实现
服务器编程接口为用户定义的C函数给予了在其函数或过程中运行SQL命令的能力。Postgres Document official
首先,你必须包括所需的头文件的#include“executor/spi.h”,然后在函数调用SPI_connect()中

相关问题