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

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;

如果在 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 直譯器專門用於 plperlplperlu 時執行的 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。此引數不影響當前會話中已編譯的函式。

43.8.2. 限制和缺失的功能 #

PL/Perl 目前缺少以下功能,但歡迎大家貢獻。

  • PL/Perl 函式不能直接相互呼叫。

  • SPI 尚未完全實現。

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

    當一個返回集合的函式透過 return 將大量行集返回給 PostgreSQL 時,會發生類似的問題。您也可以透過使用 return_next 為返回的每一行返回來避免此問題,如前所述。

  • 當會話正常結束,而不是由於致命錯誤而結束時,將執行已定義的任何 END 塊。目前沒有執行其他操作。特別是,檔案控制代碼不會自動重新整理,物件也不會自動銷燬。

提交更正

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