本節列出影響 PL/Perl 的設定參數。
plperl.on_init
(string
) #指定當 Perl 直譯器首次初始化時要執行的 Perl 程式碼,在它專門用於 plperl
或 plperlu
之前。 當執行此程式碼時,SPI 函數不可用。 如果程式碼失敗並出現錯誤,它將中止直譯器的初始化,並傳播到呼叫查詢,導致目前的交易或子交易中止。
Perl 程式碼僅限於單一字串。 更長的程式碼可以放置在模組中,並由 on_init
字串載入。 範例
plperl.on_init = 'require "plperlinit.pl"' plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'
由 plperl.on_init
直接或間接載入的任何模組都可以供 plperl
使用。 這可能會造成安全性風險。 若要查看已載入哪些模組,您可以使用
DO 'elog(WARNING, join ", ", sort keys %INC)' LANGUAGE plperl;
如果 plperl
程式庫包含在 shared_preload_libraries 中,則初始化將在 postmaster 中發生,在這種情況下,應額外考慮使 postmaster 不穩定的風險。 使用此功能的主要原因是,plperl.on_init
載入的 Perl 模組只需要在 postmaster 啟動時載入,並且可以立即使用,而無需在個別資料庫工作階段中進行載入。 但是,請記住,只有資料庫工作階段使用的第一個 Perl 直譯器才能避免這種額外負荷 — 或是 PL/PerlU,或是第一個呼叫 PL/Perl 函數的 SQL 角色的 PL/Perl。 在資料庫工作階段中建立的任何其他 Perl 直譯器都必須重新執行 plperl.on_init
。 此外,在 Windows 上,預先載入將不會有任何節省,因為在 postmaster 處理程序中建立的 Perl 直譯器不會傳播到子處理程序。
此參數只能在 postgresql.conf
檔案或伺服器命令列中設定。
plperl.on_plperl_init
(string
) plperl.on_plperlu_init
(string
) #這些參數指定當 Perl 直譯器專用於 plperl
或 plperlu
時要執行的 Perl 程式碼。 這將在資料庫工作階段中首次執行 PL/Perl 或 PL/PerlU 函數時,或者因為呼叫了另一種語言或新的 SQL 角色呼叫了 PL/Perl 函數而必須建立額外的直譯器時發生。 這是在 plperl.on_init
完成任何初始化之後。 當執行此程式碼時,SPI 函數不可用。 plperl.on_plperl_init
中的 Perl 程式碼是在 「鎖定」直譯器之後執行的,因此它只能執行受信任的操作。
如果程式碼失敗並出現錯誤,它將中止初始化,並傳播到呼叫查詢,導致目前的交易或子交易中止。 Perl 中已執行的任何動作都不會復原;但是,該直譯器將不再使用。 如果再次使用該語言,將在新的 Perl 直譯器中再次嘗試初始化。
只有超級使用者才能變更這些設定。 雖然可以在工作階段中變更這些設定,但這些變更不會影響已用於執行函數的 Perl 直譯器。
plperl.use_strict
(boolean
) #當設定為 true 時,後續編譯 PL/Perl 函數將啟用 strict
編譯指示詞。 此參數不會影響目前工作階段中已編譯的函數。
PL/Perl 目前缺少以下功能,但它們會很受歡迎。
PL/Perl 函數無法直接互相呼叫。
SPI 尚未完全實作。
如果您使用 spi_exec_query
提取非常大的資料集,您應該知道這些資料集都會進入記憶體。 您可以使用 spi_query
/spi_fetchrow
來避免這種情況,如先前所示。
如果傳回集合的函數透過 return
將大量的列集合傳回給 PostgreSQL,也會發生類似的問題。 您也可以透過對傳回的每一列使用 return_next
來避免此問題,如先前所示。
當工作階段正常結束時,而不是由於發生嚴重錯誤,則會執行已定義的任何 END
區塊。 目前不執行其他動作。 具體而言,檔案控制代碼不會自動清除,並且物件不會自動銷毀。
如果您在文件中看到任何不正確、與您特定功能體驗不符或需要進一步說明的內容,請使用此表格來回報文件問題。