Chapter 44. 服务器编程接口

Table of Contents
44.1. 接口函数
SPI_connect -- 连接一个过程到 SPI 管理器
SPI_finish -- 将一个过程从 SPI 管理器断开
SPI_push -- 下推 SPI 栈以允许递归的 SPI 使用
SPI_pop -- 从 SPI 栈弹出以从递归的 SPI 使用中返回
SPI_execute -- 执行一个命令
SPI_exec -- execute a read/write command
SPI_execute_with_args -- execute a command with out-of-line parameters
SPI_prepare -- prepare a statement, without executing it yet
SPI_prepare_cursor -- prepare a statement, without executing it yet
SPI_prepare_params -- prepare a statement, without executing it yet
SPI_getargcount -- return the number of arguments needed by a statement prepared by SPI_prepare
SPI_getargtypeid -- return the data type OID for an argument of a statement prepared by SPI_prepare
SPI_is_cursor_plan -- return true if a statement prepared by SPI_prepare can be used with SPI_cursor_open
SPI_execute_plan -- execute a statement prepared by SPI_prepare
SPI_execute_plan_with_paramlist -- execute a statement prepared by SPI_prepare
SPI_execp -- execute a statement in read/write mode
SPI_cursor_open -- set up a cursor using a statement created with SPI_prepare
SPI_cursor_open_with_args -- set up a cursor using a query and parameters
SPI_cursor_open_with_paramlist -- set up a cursor using parameters
SPI_cursor_find -- find an existing cursor by name
SPI_cursor_fetch -- fetch some rows from a cursor
SPI_cursor_move -- move a cursor
SPI_scroll_cursor_fetch -- fetch some rows from a cursor
SPI_scroll_cursor_move -- move a cursor
SPI_cursor_close -- close a cursor
SPI_keepplan -- save a prepared statement
SPI_saveplan -- save a prepared statement
44.2. Interface Support Functions
SPI_fname -- determine the column name for the specified column number
SPI_fnumber -- determine the column number for the specified column name
SPI_getvalue -- return the string value of the specified column
SPI_getbinval -- return the binary value of the specified column
SPI_gettype -- return the data type name of the specified column
SPI_gettypeid -- return the data type OID of the specified column
SPI_getrelname -- return the name of the specified relation
SPI_getnspname -- return the namespace of the specified relation
44.3. Memory Management
SPI_palloc -- allocate memory in the upper executor context
SPI_repalloc -- reallocate memory in the upper executor context
SPI_pfree -- free memory in the upper executor context
SPI_copytuple -- make a copy of a row in the upper executor context
SPI_returntuple -- prepare to return a tuple as a Datum
SPI_modifytuple -- create a row by replacing selected fields of a given row
SPI_freetuple -- free a row allocated in the upper executor context
SPI_freetuptable -- free a row set created by SPI_execute or a similar function
SPI_freeplan -- free a previously saved prepared statement
44.4. Visibility of Data Changes
44.5. 例子

服务器编程接口SPI)给予用户定义C函数编写者在其函数内运行SQL命令的能力。SPI是一组接口函数,它们可以简化对解析器、规划器和执行器的访问。SPI也做一些内存管理。

Note: 可用的过程语言提供了多种方法从过程中执行 SQL 命令。大部分这些设施都是基于 SPI 的,因此这个文档也对那些语言的用户有用。

为了避免误解,我们在谈及SPI接口函数时使用术语"函数",而谈及使用SPI的用户定义的 C 函数时使用术语"过程"

注意如果一个通过 SPI 调用的命令失败,那么控制将会返回到你的过程中。当然啦,你的过程所在的事务或者子事务将被回滚(这可能看起来令人惊讶,因为据文档所说 SPI 函数大多数都有错误返回约定。但是那些约定只适用于在 SPI 函数本身内部检测到的错误)。通过在可能失败的 SPI 调用周围建立自己的子事务可以在错误之后恢复控制。当前文档中并未记载这些,因为所需的机制仍然在变化中。

SPI成功时返回一个非负结果(要么通过一个返回的整数值,要么如下所述放在全局变量SPI_result中)。错误时,将会返回一个负结果或者NULL

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