2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

SPI_prepare

SPI_prepare — 準備一個語句,暫不執行

概要

SPIPlanPtr SPI_prepare(const char * command, int nargs, Oid * argtypes)

描述

SPI_prepare 會為指定的命令建立並返回一個預備語句,但不會執行該命令。該預備語句之後可以使用 SPI_execute_plan 進行重複執行。

當需要重複執行相同或相似的命令時,通常的好處是隻進行一次解析分析,並且可能進一步的好處是為命令重用執行計劃。 SPI_prepare 將命令字串轉換為一個預備語句,該語句封裝瞭解析分析的結果。該預備語句還為快取執行計劃提供了一個位置,如果發現為每次執行生成定製計劃沒有幫助的話。

可以透過在普通命令中的常量位置寫入引數($1$2 等)來泛化預備命令。引數的實際值隨後在呼叫 SPI_execute_plan 時指定。這使得預備命令可以用於比沒有引數時更廣泛的場景。

SPI_prepare 返回的語句只能在當前 C 函式的呼叫中使用,因為 SPI_finish 會釋放為此類語句分配的記憶體。但可以使用 SPI_keepplanSPI_saveplan 函式將該語句儲存更長時間。

引數

const char * command

command string

int nargs

輸入引數的數量($1$2 等)

Oid * argtypes

指向一個數組的指標,其中包含OID引數的資料型別

返回值

SPI_prepare 返回一個非空指標,指向 SPIPlan,這是一個表示預備語句的不透明結構。發生錯誤時,將返回 NULL,並且 SPI_result 將被設定為與 SPI_execute 使用的錯誤程式碼相同的錯誤程式碼之一,但如果 commandNULL,或者 nargs 小於 0,或者 nargs 大於 0 且 argtypesNULL,則其將被設定為 SPI_ERROR_ARGUMENT

註釋

如果沒有定義引數,將在第一次使用 SPI_execute_plan 時建立一個通用計劃,並用於所有後續執行。如果存在引數,第一次使用 SPI_execute_plan 將生成特定於提供的引數值的定製計劃。在使用相同的預備語句足夠多次後,SPI_execute_plan 將構建一個通用計劃,如果通用計劃的開銷不會比定製計劃高太多,它將開始使用通用計劃而不是每次都重新規劃。如果預設行為不適用,您可以透過將 CURSOR_OPT_GENERIC_PLANCURSOR_OPT_CUSTOM_PLAN 標誌傳遞給 SPI_prepare_cursor 來改變它,分別強制使用通用計劃或定製計劃。

儘管預備語句的主要作用是避免對語句進行重複的解析分析和規劃,但當語句中使用的資料庫物件在上次使用預備語句後經歷了定義(DDL)更改時,PostgreSQL 會強制對語句進行重新分析和重新規劃。此外,如果 search_path 的值在使用之間發生變化,該語句將使用新的 search_path 進行重新解析。(此後者的行為是 PostgreSQL 9.3 及以後的新特性。)有關預備語句行為的更多資訊,請參閱 PREPARE

此函式只能從已連線的 C 函式中呼叫。

SPIPlanPtrspi.h 中被宣告為指向不透明結構型別的指標。嘗試直接訪問其內容是不明智的,因為這會使您的程式碼在 PostgreSQL 的未來版本中更容易出現問題。

名稱 SPIPlanPtr 具有一定的歷史性,因為該資料結構不再一定包含執行計劃。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用 此表單 報告文件問題。