多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Chapter 44\. 服务器编程接口 **Table of Contents** + 44.1\. 接口函数 + [SPI_connect](#calibre_link-1718) -- 把一个过程与 SPI 管理器连接起来 + [SPI_finish](#calibre_link-561) -- 把一个过程与 SPI 管理器断开 + [SPI_push](#calibre_link-560) --  对 SPI 堆栈进行压栈操作以允许递归的 SPI 使用 + [SPI_pop](#calibre_link-563) -- 弹出 SPI 堆栈以从递归的 SPI 使用中返回 + [SPI_execute](#calibre_link-1719) -- 执行一条命令 + [SPI_exec](#calibre_link-640) -- 执行一个读/写命令 + [SPI_execute_with_args](#calibre_link-639) -- 执行一个带有外联参数的命令 + [SPI_prepare](#calibre_link-641) -- 准备一个规划但不立即执行它 + [SPI_prepare_cursor](#calibre_link-673) -- 准备一个语句但不立即执行它 + [SPI_prepare_params](#calibre_link-674) -- 准备一个语句但不立即执行它 + [SPI_getargcount](#calibre_link-1720) -- 返回一个`SPI_prepare` 准备的已准备好语句需要的参数个数 + [SPI_getargtypeid](#calibre_link-766) -- 返回`SPI_prepare` 准备的已准备好语句的参数的数据类型OID + [SPI_is_cursor_plan](#calibre_link-765) -- 如果一个`SPI_prepare`准备的语句可以和 `SPI_cursor_open`一起使用,则返回`true` + [SPI_execute_plan](#calibre_link-767) -- 执行一个`SPI_prepare`准备的语句 + [SPI_execute_plan_with_paramlist](#calibre_link-899) -- 执行一个`SPI_prepare`准备的已准备好的语句 + [SPI_execp](#calibre_link-900) -- 以读/写模式执行一个准备的查询规划 + [SPI_cursor_open](#calibre_link-1721) -- 用`SPI_prepare`创建的语句设置一个游标 + [SPI_cursor_open_with_args](#calibre_link-1722) -- 使用查询和参数设置一个游标 + [SPI_cursor_open_with_paramlist](#calibre_link-1723) -- 使用参数设置一个游标 + [SPI_cursor_find](#calibre_link-1147) -- 用名字寻找并执行一个现存的游标 + [SPI_cursor_fetch](#calibre_link-1146) -- 从一个游标里抓取一些行 + [SPI_cursor_move](#calibre_link-1148) -- 移动一个游标 + [SPI_scroll_cursor_fetch](#calibre_link-1724) -- 从一个游标中抓取一些行 + [SPI_scroll_cursor_move](#calibre_link-1725) -- 移动一个游标 + [SPI_cursor_close](#calibre_link-1726) -- 关闭一个游标 + [SPI_keepplan](#calibre_link-1727) -- 保存一个预备语句 + [SPI_saveplan](#calibre_link-1728) -- 保存一个预备语句 + 44.2\. 接口支持函数 + [SPI_fname](#calibre_link-1729) -- 从指定的字段编号判断字段名字 + [SPI_fnumber](#calibre_link-1730) -- 判断声明字段名的字段编号 + [SPI_getvalue](#calibre_link-1731) -- 返回声明字段的字符串值 + [SPI_getbinval](#calibre_link-1732) -- 返回声明字段的二进制值 + [SPI_gettype](#calibre_link-1733) -- 返回声明字段的数据类型名 + [SPI_gettypeid](#calibre_link-1734) -- 返回声明字段的数据类型OID + [SPI_getrelname](#calibre_link-1735) -- 返回声明关系的名字 + [SPI_getnspname](#calibre_link-1736) -- 返回声明关系的名字空间 + 44.3\. 内存管理 + [SPI_palloc](#calibre_link-1737) -- 在上层执行器环境里分配内存 + [SPI_repalloc](#calibre_link-1738) -- 在上层执行器环境里重新分配内存 + [SPI_pfree](#calibre_link-1739) -- 在上层执行器环境里释放内存 + [SPI_copytuple](#calibre_link-1740) -- 在上层执行者环境里制作一个行的拷贝 + [SPI_returntuple](#calibre_link-1741) -- 准备把一个行当作 Datum 返回 + [SPI_modifytuple](#calibre_link-1742) -- 通过替换一个给出行的选定的字段创建一行 + [SPI_freetuple](#calibre_link-1743) -- 释放在上层执行者环境里分配的一行 + [SPI_freetuptable](#calibre_link-1744) -- 释放一个由`SPI_execute`或者类似的函数创建的行集 + [SPI_freeplan](#calibre_link-1745) --  释放一个前面保存的预备语句 + 44.4\. 数据改变的可视性 + 44.5\. 例子 _服务器编程接口_(SPI) 给在用户定义的C函数里面运行SQL 查询的能力。SQL是一套接口函数,用于简化对分析器、 规划器和执行器的访问。SQL还进行一些内存管理的工作。 > **Note:** 过程语言的存在也提供了其它的一些在过程里执行 SQL 命令的方法。 这些语言中的大部分本身就是基于 SPI 的, 因此这份文档可能会对那些语言的用户同样有帮助。 为了避免混淆,将使用术语"函数"(function)来代表 SPI接口函数,用"过程"(procedure) 代表用户用SPI定义的 C 函数。 注意,如果一条通过 SPI 调用的命令失败,那么控制不会返回到你的过程中。 取而代之的是,你的过程执行所在的事务或者子事务全部回滚。 这一点看起来可能很奇怪,因为大多数 SPI 函数的文档里都有错误返回习惯。 不过,那些习惯只适用于在 SPI 函数自己内部检测到的错误。 可以通过在你自己的可能失败的 SPI 调用周围建立一个子事务的方法来在错误之后恢复控制。 目前还没有写这方面的文档,因为所需要的机制仍然在变化。 如果执行成功了,SPI函数返回一个非负结果 (或者通过返回一个整数值或放在全局变量`SPI_result`里, 像下面描述的那样)。出错时,返回一个负数或`NULL`结果。 使用 SPI 的源代码文件必须包含头文件`executor/spi.h`。