W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
SPI_prepare — 準備一個語句,但不執(zhí)行它
SPIPlanPtr SPI_prepare(const char * command
, int nargs
, Oid * argtypes
)
SPI_prepare
為指定的命令創(chuàng)建并且返回一個 預備語句,但是并不執(zhí)行該命令。該預備語句會在稍后使用 SPI_execute_plan
重復執(zhí)行。
當相同的或者相似的命令要被重復執(zhí)行時,通常來說只執(zhí)行一次解析分 析是有利的,并且更有利的是重用該命令的執(zhí)行計劃。 SPI_prepare
把一個命令字符串轉換成一個預 備語句,它包裝了解析分析的結果。如果發(fā)現(xiàn)為每一次執(zhí)行都生成一個 定制計劃沒有幫助,該預備語句也提供了一個地方緩存執(zhí)行計劃。
一個預備命令可以被一般化為在一個普通命令中應該出現(xiàn)常量的地方寫 上參數(shù)($1
、$2
等等)。參數(shù)的實際值在 SPI_execute_plan
被調用時指定。這讓該預備 語句可以比沒有參數(shù)的形式用戶與更廣泛的情況。
SPI_prepare
返回的語句只能在當前的C過程調用 中使用,因為SPI_finish
會釋放為這樣一個語句 分配的內存。但是可以使用函數(shù)SPI_keepplan
或SPI_saveplan
把該語句保存更久。
const char * command
命令字符串
int nargs
輸入?yún)?shù)($1
、$2
等等)的數(shù)量
Oid * argtypes
一個數(shù)組指針,它指向的數(shù)組包含參數(shù)的數(shù)據(jù)類型的 OID
SPI_prepare
返回一個指向SPIPlan
的非空指針,它是一個表示一個預備語句的不透明結構。發(fā)生錯誤時, 將會返回NULL
,并且 SPI_result
將被設置為一個也被 SPI_execute
使用的錯誤碼,不過當
command
為NULL
、 或者nargs
小于零、或者nargs
大于 零但是argtypes
為NULL
時它會被設置為SPI_ERROR_ARGUMENT
。
如果沒有定義參數(shù),在第一次使用SPI_execute_plan
時將會創(chuàng)建一個一般的計劃,并且把它用于所有的后續(xù)執(zhí)行。如果有參數(shù), SPI_execute_plan
的前幾次使用將根據(jù)提供的參數(shù)值 產生定制計劃。在使用同一個預備語句足夠多次后, SPI_execute_plan
將構建一個一般計劃,并且如果它 并不比定制計劃昂貴太多,
SPI_execute_plan
將開始 使用一般計劃來取代每次都進行重新規(guī)劃。如果這種默認的行為不合適,你可以 通過傳遞CURSOR_OPT_GENERIC_PLAN
或 CURSOR_OPT_CUSTOM_PLAN
標志給 SPI_prepare_cursor
,以分別強制使用一般或者定制 計劃。
盡管一個預備語句的要點是避免對語句的重復解析分析以及規(guī)劃,只要語句中 用到的數(shù)據(jù)庫對象從上一次使用該預備語句以來經(jīng)歷過定義性(DDL)改變, PostgreSQL將會強制重新分析和重新規(guī)劃該語句。還有, 如果search_path的值從一個改變成下一個,該語句將 會使用新的search_path
進行重新解析(后一種行為是從
PostgreSQL9.3 開始的新行為)。更多 有關預備語句行為的信息請見PREPARE。
這個函數(shù)只能從一個已連接的C函數(shù)調用。
SPIPlanPtr
被聲明為spi.h
中的一種不透明結構類型 的指針。嘗試直接訪問其內容是不明智的,因為那會讓你的代碼更有可能會在未 來版本的PostgreSQL中崩潰。
SPIPlanPtr
這個名字多少有點歷史原因,因為該數(shù)據(jù)結構不再需要包 含一個執(zhí)行計劃。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: