第 47 章. 服务器编程接口
目录
- 47.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 查询中提供临时触发器数据
- 47.2. 接口支持函数
- SPI_fname — 确定指定列号的列名
- SPI_fnumber — 确定指定列名的列号
- SPI_getvalue — 返回指定列的字符串值
- SPI_getbinval — 返回指定列的二进制值
- SPI_gettype — 返回指定列的数据类型名称
- SPI_gettypeid — 返回指定列的数据类型
- SPI_getrelname — 返回指定关系的名称
- SPI_getnspname — 返回指定关系的命名空间
- SPI_result_code_string — 返回错误代码作为字符串
- 47.3. 内存管理
- SPI_palloc — 在上层执行器上下文中分配内存
- SPI_repalloc — 在上层执行器上下文中重新分配内存
- SPI_pfree — 在上层执行器上下文中释放内存
- SPI_copytuple — 在上层执行器上下文中复制一行
- SPI_returntuple — 准备将元组作为 Datum 返回
- SPI_modifytuple — 通过替换给定行的选定字段来创建行
- SPI_freetuple — 释放上层执行器上下文中分配的行
- SPI_freetuptable — 释放由
SPI_execute
或类似函数创建的行集 - SPI_freeplan — 释放先前保存的已准备语句
- 47.4. 事务管理
- SPI_commit — 提交当前事务
- SPI_rollback — 中止当前事务
- SPI_start_transaction — 已过时的函数
- 47.5. 数据更改的可见性
- 47.6. 示例
服务器编程接口(SPI) 使用户定义的C函数的编写者能够在其函数或过程中运行SQL命令。SPI是一组接口函数,用于简化对解析器、规划器和执行器的访问。SPI还执行一些内存管理。
注意
可用的过程语言提供了从函数执行 SQL 命令的各种方法。这些工具中的大多数都基于 SPI,因此本文档可能也对这些语言的用户有用。
请注意,如果通过 SPI 调用的命令失败,则不会将控制权返回给您的 C 函数。相反,执行 C 函数的事务或子事务将回滚。(这似乎令人惊讶,因为 SPI 函数大多记录了错误返回约定。但这些约定仅适用于 SPI 函数本身内检测到的错误。)可以通过在可能失败的 SPI 调用周围建立自己的子事务来在错误后恢复控制权。
SPI函数在成功时返回非负结果(通过返回的整数值或全局变量SPI_result
,如下所述)。发生错误时,将返回负结果或NULL
。
使用 SPI 的源代码文件必须包含头文件executor/spi.h
。