历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
第 41 章 服务器编程接口
目录
- 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 为蓝本,因此本文档对这些语言的用户也会有帮助。
为避免误解,本文用“函数”指SPI接口函数,而用“过程”指使用SPI的用户定义 C 函数。
注意,如果在过程执行期间,事务因某条命令中的错误而中止,控制将不会返回到你的过程。相反,所有工作都会被回滚,服务器将等待客户端的下一条命令。一个相关的限制是无法在过程内部执行 BEGIN、COMMIT 和 ROLLBACK(事务控制语句)。这两个限制将来都可能会被改变。
SPI 函数在成功时返回非负结果(要么直接作为整数返回值,要么如后文所述存放在全局变量 SPI_result 中)。发生错误时,则返回负值或 NULL。
使用 SPI 的源代码文件必须包含头文件
executor/spi.h。
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 — 保存一个计划