PostgreSQL SPI_prepare

2021-09-06 10:53 更新

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_keepplanSPI_saveplan把該語句保存更久。

參數(shù)

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大于 零但是argtypesNULL 時它會被設置為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_PLANCURSOR_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í)行計劃。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號