Chapter 41. 服务器编程接口

Table of Contents
41.1. 接口函数
SPI_connect — 把你一个过程与 SPI 管理器连接起来。
SPI_finish — 把一个过程与 SPI 管理器断开
SPI_exec — 执行一条命令
SPI_prepare — 为一个命令准备一个规划,但还不执行它
SPI_execp — 执行一个 SPI_prepare 准备的查询规划
SPI_cursor_open — 用 SPI_prepare 创建的规划设置一个游标
SPI_cursor_find — 用名字寻找并执行一个现存的游标
SPI_cursor_fetch — 从一个游标里抓取一些行
SPI_cursor_move — 移动一个游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个规划
41.2. 接口支持函数
SPI_fname — 从指定的字段编号判断字段名字
SPI_fnumber — 判断声明的字段名的字段编号
SPI_getvalue — 返回声明字段的字串值
SPI_getbinval — 返回声明字段的二进制值
SPI_gettype — 返回声明的字段的数据类型名
SPI_gettypeid — 返回声明的字段的数据类型 OID
SPI_getrelname — 返回声明关系的名字
41.3. 存储器管理
SPI_palloc — 在上层执行器环境里分配内存
SPI_repalloc — 在上层执行器环境里重新分配内存
SPI_pfree — 在上层执行器环境里释放内存
SPI_copytuple — 在上层执行者环境里制作一个行的拷贝
SPI_copytupledesc — 在上层执行者环境里制作一个行描述符的拷贝
SPI_copytupleintoslot — 在上层执行者环境里制作一行和描述器的拷贝
SPI_modifytuple — 通过替换一个给出行的选定的字段创建一行
SPI_freetuple — 释放在上层执行者环境里分配的一行
SPI_freetuptable — 释放一个由 SPI_exec 或者类似的函数创建的行集
SPI_freeplan — 释放一个前面保存的规划
41.4. 数据改变的可视性
41.5. 例子

服务器编程接口SPI) 给我们在用户定义的C函数里面运行 SQL 查询的能力。 SPI 是一套接口函数,用于简化对分析器,规划器,优化器,和执行器的访问。 SPI 还进行一些内存管理的工作。

注意: 过程语言的存在也提供了其它的一些在过程里执行 SQL 命令的方法。 这些语言中的一部分本身就是基于 SPI 或者以 SPI 为模版实现的, 因此这份文档可能会对那些语言的用户同样有帮助。

为了避免混淆,我们将使用函数(function) 来代表SPI接口函数, 用过程(procedure) 代表用户用 SPI 定义的 C 函数。

注意,如果在你的过程里执行查询时,事务退出了,那么控制不会返回到你的过程中。 相反,所有工作都将回卷并且服务器将等待客户端的另一个命令。 一个相关的限制是在过程中不能执行 BEGINCOMMIT,和 ROLLBACK (事务控制语句)。这两点都可能会在以后的版本中修正。

如果执行成功了,SPI 函数返回一个非负结果 (或者通过返回一个整数值或放在全局变量SPI_result里, 象下面描述的那样)。出错时,返回一个负数或 NULL 结果。

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

41.1. 接口函数

Table of Contents
SPI_connect — 把你一个过程与 SPI 管理器连接起来。
SPI_finish — 把一个过程与 SPI 管理器断开
SPI_exec — 执行一条命令
SPI_prepare — 为一个命令准备一个规划,但还不执行它
SPI_execp — 执行一个 SPI_prepare 准备的查询规划
SPI_cursor_open — 用 SPI_prepare 创建的规划设置一个游标
SPI_cursor_find — 用名字寻找并执行一个现存的游标
SPI_cursor_fetch — 从一个游标里抓取一些行
SPI_cursor_move — 移动一个游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个规划