Chapter 39. 伺服器編程接口

Table of Contents
39.1. 接口函數
SPI_connect — 把您一個過程與 SPI 管理器連接起來。
SPI_finish — 把一個過程與 SPI 管理器斷開
SPI_push — 對 SPI 堆棧進行壓棧操作以允許遞規的 SPI 使用
SPI_pop — 彈出 SPI 堆棧以允許遞規 SPI 使用
SPI_execute — 執行一條命令
SPI_exec — 執行一個讀/寫命令
SPI_prepare — 為一個命令準備一個規劃,但還不執行它
SPI_getargcount — 返回一個 SPI_prepare 準備的已準備好規劃需要的參數個數
SPI_getargtypeid — 返回 SPI_prepare 準備的已準備好規劃的指定參數的 typeid
SPI_is_cursor_plan — 如果一個 SPI_prepare 準備的規劃可以和 SPI_cursor_open 一起使用,則返回真
SPI_execute_plan — 執行一個 SPI_prepare 準備的查詢規劃
SPI_execp — 以讀/寫模式執行一個準備的查詢規劃
SPI_cursor_open — 用 SPI_prepare 建立的規劃設置一個游標
SPI_cursor_find — 用名字尋找並執行一個現存的游標
SPI_cursor_fetch — 從一個游標裡抓取一些行
SPI_cursor_move — 移動一個游標
SPI_cursor_close — 關閉一個游標
SPI_saveplan — 保存一個規劃
39.2. 接口支援函數
SPI_fname — 從指定的字串編號判斷字串名字
SPI_fnumber — 判斷聲明的字串名的字串編號
SPI_getvalue — 返回聲明字串的字串值
SPI_getbinval — 返回聲明字串的二進制值
SPI_gettype — 返回聲明的字串的資料類型名
SPI_gettypeid — 返回聲明的字串的資料類型 OID
SPI_getrelname — 返回聲明關係的名字
39.3. 儲存器管理
SPI_palloc — 在上層執行器環境裡分配內存
SPI_repalloc — 在上層執行器環境裡重新分配內存
SPI_pfree — 在上層執行器環境裡釋放內存
SPI_copytuple — 在上層執行者環境裡製作一個行的拷貝
SPI_returntuple — 準備把一個資料當作 Datum 返回
SPI_modifytuple — 透過替換一個給出行的選定的字串建立一行
SPI_freetuple — 釋放在上層執行者環境裡分配的一行
SPI_freetuptable — 釋放一個由 SPI_execute 或者類似的函數建立的行集
SPI_freeplan — 釋放一個前面保存的規劃
39.4. 資料改變的可讀性
39.5. 例子

伺服器編程接口SPI) 給我們在用戶定義的C函數里面執行 SQL 查詢的能力。 SPI 是一套接口函數,用於簡化對分析器,規劃器,優化器,和執行器的訪問。 SPI 還進行一些內存管理的工作。

注意: 過程語言的存在也提供了其它的一些在過程裡執行 SQL 命令的方法。 這些語言中的大部分本身就是基於 SPI的, 因此這份文件可能會對那些語言的用戶同樣有幫助。

為了避免混淆,我們將使用函數(function) 來代資料表SPI接口函數, 用過程(procedure) 代資料表用戶用 SPI 定義的 C 函數。

注意,一條透過 SPI 調用的命令失敗,那麼控制不會返回到您的過程中。 取而代之的是,您的過程執行所在的交易或者子交易作都將回捲。 (這一點看起來可能很奇怪,因為大多數 SPI 函數的文件裡都有錯誤返回習慣。 不過,那些習慣只適用於在 SPI 函數自己內部檢測到的錯誤。) 我們可以透過在您自己的可能失敗的 SPI 調用周圍建立一個子交易的方法來在錯誤之後恢復。 目前我們還沒有寫這方面的文件,因為所需要的機制仍然在變化。

如果執行成功了,SPI 函數返回一個非負結果 (或者透過返回一個整數值或放在全局變量SPI_result裡, 象下面描述的那樣)。出錯時,返回一個負數或 NULL 結果。

使用 SPI 的原始碼文件必須包含頭文件 executor/spi.h

39.1. 接口函數

Table of Contents
SPI_connect — 把您一個過程與 SPI 管理器連接起來。
SPI_finish — 把一個過程與 SPI 管理器斷開
SPI_push — 對 SPI 堆棧進行壓棧操作以允許遞規的 SPI 使用
SPI_pop — 彈出 SPI 堆棧以允許遞規 SPI 使用
SPI_execute — 執行一條命令
SPI_exec — 執行一個讀/寫命令
SPI_prepare — 為一個命令準備一個規劃,但還不執行它
SPI_getargcount — 返回一個 SPI_prepare 準備的已準備好規劃需要的參數個數
SPI_getargtypeid — 返回 SPI_prepare 準備的已準備好規劃的指定參數的 typeid
SPI_is_cursor_plan — 如果一個 SPI_prepare 準備的規劃可以和 SPI_cursor_open 一起使用,則返回真
SPI_execute_plan — 執行一個 SPI_prepare 準備的查詢規劃
SPI_execp — 以讀/寫模式執行一個準備的查詢規劃
SPI_cursor_open — 用 SPI_prepare 建立的規劃設置一個游標
SPI_cursor_find — 用名字尋找並執行一個現存的游標
SPI_cursor_fetch — 從一個游標裡抓取一些行
SPI_cursor_move — 移動一個游標
SPI_cursor_close — 關閉一個游標
SPI_saveplan — 保存一個規劃