本節列出了影響 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;
如果在 shared_preload_libraries 中包含了 plperl
庫,則初始化將在 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 函式時,或者當需要建立額外的直譯器(因為其他語言被呼叫或 PL/Perl 函式被新的 SQL 角色呼叫)時,就會發生這種情況。這發生在 plperl.on_init
完成任何初始化之後。執行此程式碼時 SPI 函式不可用。在直譯器被“鎖定”之後,plperl.on_plperl_init
中的 Perl 程式碼才會被執行,因此它只能執行受信任的操作。
如果程式碼因錯誤而失敗,它將中止初始化並將錯誤傳播給呼叫查詢,導致當前事務或子事務被中止。Perl 中已執行的任何操作都不會被撤銷;但是,該直譯器將不再被使用。如果再次使用該語言,將在新的 Perl 直譯器中重新嘗試初始化。
只有超級使用者才能更改這些設定。雖然可以在會話中更改這些設定,但這些更改不會影響已用於執行函式的 Perl 直譯器。
plperl.use_strict
(boolean
) #當設定為 true 時,後續編譯的 PL/Perl 函式將啟用 strict
pragma。此引數不影響當前會話中已編譯的函式。
PL/Perl 目前缺少以下功能,但歡迎大家貢獻。
PL/Perl 函式不能直接相互呼叫。
SPI 尚未完全實現。
如果您使用 spi_exec_query
提取非常大的資料集,您應該意識到這些資料都會進入記憶體。您可以透過使用 spi_query
/spi_fetchrow
來避免這種情況,如前所述。
當一個返回集合的函式透過 return
將大量行集返回給 PostgreSQL 時,會發生類似的問題。您也可以透過使用 return_next
為返回的每一行返回來避免此問題,如前所述。
當會話正常結束,而不是由於致命錯誤而結束時,將執行已定義的任何 END
塊。目前沒有執行其他操作。特別是,檔案控制代碼不會自動重新整理,物件也不會自動銷燬。
如果您在文件中發現任何不正確之處、與您對特定功能的實際體驗不符或需要進一步澄清的地方,請使用 此表格 報告文件問題。