历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.
第 17 章 服务器编程接口
目录
- 17.1. 接口函数
- SPI_connect — 将你的过程连接到 SPI 管理器。
- SPI_finish — 将你的过程与 SPI 管理器断开连接。
- SPI_exec — 创建一个执行计划(解析器+规划器+优化器)并执行查询。
- SPI_prepare — 为查询准备一个计划,但暂不执行
- SPI_execp — 执行来自
SPI_prepare的计划 - SPI_cursor_open — 使用由
SPI_prepare创建的计划建立一个游标 - SPI_cursor_find — 按名称查找现有的游标(Portal)
- SPI_cursor_fetch — 从一个游标中取出一些行
- SPI_cursor_move — 移动游标
- SPI_cursor_close — 关闭一个游标
- SPI_saveplan — 保存传入的计划
- 17.2. 接口支持函数
- SPI_fnumber — 查找指定属性名称的属性编号
- SPI_fname — 查找指定属性编号的属性名称
- SPI_getvalue — 返回指定属性的字符串值
- SPI_getbinval — 返回指定属性的二进制值
- SPI_gettype — 返回指定属性的类型名称
- SPI_gettypeid — 返回指定属性的类型 OID
- SPI_getrelname — 返回指定关系的名称
- 17.3. 内存管理
- SPI_copytuple — 在上层执行器上下文中创建元组的副本
- SPI_copytupledesc — 在上层执行器上下文中创建元组描述符的副本
- SPI_copytupleintoslot — 在上层执行器上下文中创建元组及其描述符的副本
- SPI_modifytuple — 通过替换给定元组中的选定字段来创建一个元组
- SPI_palloc — 在上层执行器上下文中分配内存
- SPI_repalloc — 在上层执行器上下文中重新分配内存
- SPI_pfree — 在上层执行器上下文中释放内存
- SPI_freetuple — 释放先前在上层执行器上下文中分配的元组
- SPI_freetuptable — 释放由
SPI_exec或类似函数创建的元组集 - SPI_freeplan — 释放一个先前保存的计划
- 17.4. 数据更改的可见性
- 17.5. 示例
服务器编程接口(SPI)使用户能够在用户定义的 C 函数中运行 SQL 查询。
注意
可用的过程语言(PL)提供了另一种构建可执行查询的函数的方法。
实际上,SPI 只是一组简化对解析器、规划器、优化器和执行器访问的本地接口函数。SPI 还做一部分内存管理工作。
为避免误解,我们用函数指 SPI 接口函数,而用过程指使用 SPI 的用户定义 C 函数。
使用 SPI 的过程由执行器调用。这些 SPI 调用又会递归地调用执行器来运行查询。当执行器被递归调用时,它自己也可能调用过程,而这些过程又可能发起 SPI 调用。
注意,如果在执行来自过程的查询期间事务被中止,控制将不会返回到你的过程。相反,所有工作都会被回滚,服务器会等待客户端的下一条命令。这一点在未来的版本中可能会被改变。
一个相关的限制是无法执行 BEGIN、END 和 ABORT(事务控制语句)。这一点将来也会被改变。
成功时,SPI 函数返回非负结果(或者通过整型返回值返回,或者如下文所述存放在全局变量 SPI_result 中)。出错时,将返回负值或 NULL。
17.1. 接口函数 #
- SPI_connect — 将你的过程连接到 SPI 管理器。
- SPI_finish — 将你的过程与 SPI 管理器断开连接。
- SPI_exec — 创建一个执行计划(解析器+规划器+优化器)并执行查询。
- SPI_prepare — 为查询准备一个计划,但暂不执行
- SPI_execp — 执行来自
SPI_prepare的计划 - SPI_cursor_open — 使用由
SPI_prepare创建的计划建立一个游标 - SPI_cursor_find — 按名称查找现有的游标(Portal)
- SPI_cursor_fetch — 从一个游标中取出一些行
- SPI_cursor_move — 移动游标
- SPI_cursor_close — 关闭一个游标
- SPI_saveplan — 保存传入的计划