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



我正在研究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命令?任何帮助将不胜感激!

您可以使用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示例

您可以使用SPI(服务器编程接口)。

服务器程序设计接口(SPI)提供了用户定义的C语言编写器在函数或函数中运行SQL命令的能力程序。SPI是一组简化访问的接口函数解析器、规划器和执行器。SPI也做一些内存管理。

的例子:https://www.postgresql.org/docs/current/spi-examples.html

可以使用postgreSQL提供的服务器编程接口

服务器编程接口为用户定义的C函数提供了使用方法,使其能够在其函数或过程中运行SQL命令。Postgres文档官方版

首先必须包含必需的标头# include"遗嘱执行人/spi.h"然后内部函数调用SPI_connect()

您可以使用服务器编程接口(SPI)在C函数代码中运行sql语句。我建议你在这里阅读更多关于它的内容,看看你到底需要什么来使你的代码工作。