支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

43.8. PL/Perl 底層原理 #

43.8.1. 設定 #

本節列出影響 PL/Perl 的設定參數。

plperl.on_init (string) #

指定當 Perl 直譯器首次初始化時要執行的 Perl 程式碼,在它專門用於 plperlplperlu 之前。 當執行此程式碼時,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 直譯器專用於 plperlplperlu 時要執行的 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 編譯指示詞。 此參數不會影響目前工作階段中已編譯的函數。

43.8.2. 限制與遺漏功能 #

PL/Perl 目前缺少以下功能,但它們會很受歡迎。

  • PL/Perl 函數無法直接互相呼叫。

  • SPI 尚未完全實作。

  • 如果您使用 spi_exec_query 提取非常大的資料集,您應該知道這些資料集都會進入記憶體。 您可以使用 spi_query/spi_fetchrow 來避免這種情況,如先前所示。

    如果傳回集合的函數透過 return 將大量的列集合傳回給 PostgreSQL,也會發生類似的問題。 您也可以透過對傳回的每一列使用 return_next 來避免此問題,如先前所示。

  • 當工作階段正常結束時,而不是由於發生嚴重錯誤,則會執行已定義的任何 END 區塊。 目前不執行其他動作。 具體而言,檔案控制代碼不會自動清除,並且物件不會自動銷毀。

提交更正

如果您在文件中看到任何不正確、與您特定功能體驗不符或需要進一步說明的內容,請使用此表格來回報文件問題。