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 — 保存一個規劃