PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

Chapter 45. 服务端编程接口(SPI)

Table of Contents

45.1. 接口核心函数
SPI_connect — 把一个 C 函数连接到 SPI 管理器
SPI_finish — 把一个 C 函数从 SPI 管理器断开
SPI_execute — 执行一条命令
SPI_exec — 以读/写模式执行一条命令
SPI_execute_extended — 执行带行外参数的命令
SPI_execute_with_args — 执行带行外参数的命令
SPI_prepare — 准备一条语句,但还不执行它
SPI_prepare_cursor — 准备一条语句,但还不执行它
SPI_prepare_extended — 准备一条语句,但还不执行它
SPI_prepare_params — 准备一条语句,但还不执行它
SPI_getargcount — 返回由 SPI_prepare 预备的语句所需的参数 数量
SPI_getargtypeid — 返回由 SPI_prepare 预备的语句某个参数的数据类型 OID
SPI_is_cursor_plan — 如果由 SPI_prepare 预备的语句可以与 SPI_cursor_open 一起使用则返回 true
SPI_execute_plan — 执行由 SPI_prepare 预备的语句
SPI_execute_plan_extended — 执行由 SPI_prepare 预备的语句
SPI_execute_plan_with_paramlist — 执行由 SPI_prepare 预备的语句
SPI_execp — 以读/写模式执行一条语句
SPI_cursor_open — 用 SPI_prepare 创建的语句建立一个游标
SPI_cursor_open_with_args — 用一个查询和参数建立一个游标
SPI_cursor_open_with_paramlist — 用参数建立一个游标
SPI_cursor_parse_open — 用一个查询字符串和参数建立一个游标
SPI_cursor_find — 按名称查找一个现有的游标
SPI_cursor_fetch — 从一个游标取回一些行
SPI_cursor_move — 移动一个游标
SPI_scroll_cursor_fetch — 从一个游标取回一些行
SPI_scroll_cursor_move — 移动一个游标
SPI_cursor_close — 关闭一个游标
SPI_keepplan — 保存一个预备好的语句
SPI_saveplan — 保存一个预备好的语句
SPI_register_relation — 让一个临时命名关系在 SPI 查询中可以按名称 使用
SPI_unregister_relation — 从注册表中移除一个临时命名关系
SPI_register_trigger_data — 让临时触发器数据在 SPI 查询中可用
45.2. 接口支持函数
SPI_fname — 确定指定列号的列名
SPI_fnumber — 确定指定列名的列号
SPI_getvalue — 返回指定列的字符串值
SPI_getbinval — 返回指定列的二进制值
SPI_gettype — 返回指定列的数据类型名称
SPI_gettypeid — 返回指定列的数据类型 OID
SPI_getrelname — 返回指定关系的名称
SPI_getnspname — 返回指定关系的命名空间
SPI_result_code_string — 以字符串形式返回错误代码
45.3. 内存管理
SPI_palloc — 在上层执行器上下文中分配内存
SPI_repalloc — 在上层执行器上下文中重新分配内存
SPI_pfree — 释放上层执行器上下文中的内存
SPI_copytuple — 在上层执行器上下文中复制一行
SPI_returntuple — 准备把一个元组作为 Datum 返回
SPI_modifytuple — 通过替换给定行中被选中的字段创建一行
SPI_freetuple — 释放在上层执行器上下文中分配的一行
SPI_freetuptable — 释放由 SPI_execute 或类似函数创建的行集
SPI_freeplan — 释放一个之前保存的预备语句
45.4. 事务管理
SPI_commit — 提交当前事务
SPI_rollback — 中止当前事务
SPI_start_transaction — 已废弃的函数
45.5. 数据更改的可见性
45.6. 示例

服务端编程接口 (SPI)让用户定义 C 函数的作者能够在他们的函数或过程中运行 SQL 命令。 SPI 是一组用于简化对解析器、规划器和执行器 访问的接口函数。 SPI 还做一些内存管理。

Note

可用的过程语言提供了各种从函数中执行 SQL 命令的方法。 这些设施中的大多数都基于 SPI,因此这份文档对这些语言的用户也可能 有用。

注意,如果通过 SPI 调用的命令失败,控制权不会返回给您的 C 函数。 相反,您的 C 函数在其中执行的事务或子事务会被回滚。 (鉴于 SPI 函数大多具有已记录的错误返回约定,这一点可能看起来 令人意外。 不过,这些约定只适用于在 SPI 函数自身内部检测到的错误。) 通过围绕可能失败的 SPI 调用建立您自己的子事务, 可以在错误发生后恢复控制权。

SPI 函数在成功时返回一个非负结果 (要么通过返回的整数值,要么通过全局变量 SPI_result,如下文所述)。 出错时,会返回一个负结果或 NULL。

使用 SPI 的源代码文件必须包含头文件 executor/spi.h。