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 / 8.4 / 8.3 / 8.2 / 7.3 / 7.2

40.1. 安裝過程語言 #

過程語言必須被“安裝”到每個要使用該語言的資料庫中。但是,安裝在 template1 資料庫中的過程語言在所有後續建立的資料庫中都是自動可用的,因為它們在 template1 中的條目會被 CREATE DATABASE 命令複製。因此,資料庫管理員可以決定在哪些資料庫中可用哪些語言,並可以在需要時使某些語言預設可用。

對於標準發行版中提供的語言,只需執行 CREATE EXTENSION language_name 即可將語言安裝到當前資料庫。下面描述的手動過程僅推薦用於安裝尚未打包為擴充套件的語言。

手動安裝過程語言

過程語言的安裝在一個數據庫中有五個步驟,必須由資料庫超級使用者執行。在大多數情況下,所需的 SQL 命令應該打包成一個“擴充套件”的安裝指令碼,以便可以使用 CREATE EXTENSION 來執行它們。

  1. 語言處理器的共享物件必須被編譯並安裝到一個合適的庫目錄中。這與構建和安裝普通使用者定義 C 函式的模組的方式相同;參見 第 36.10.5 節。通常,語言處理器會依賴一個提供實際程式語言引擎的外部庫;如果是這樣,該庫也必須被安裝。

  2. 必須使用以下命令宣告處理器

    CREATE FUNCTION handler_function_name()
        RETURNS language_handler
        AS 'path-to-shared-object'
        LANGUAGE C;
    

    特殊的返回型別 language_handler 告訴資料庫系統該函式不返回已定義的SQL資料型別,並且不能直接用於SQL語句。

  3. 可選地,語言處理器可以提供一個“內聯”處理器函式,該函式用於執行用該語言編寫的匿名程式碼塊(DO 命令)。如果語言提供了內聯處理器函式,請使用類似以下命令的命令宣告它:

    CREATE FUNCTION inline_function_name(internal)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    
  4. 可選地,語言處理器可以提供一個“驗證器”函式,該函式可以在不實際執行函式定義的情況下檢查其正確性。如果存在驗證器函式,CREATE FUNCTION 將呼叫該函式。如果語言提供了驗證器函式,請使用類似以下命令的命令宣告它:

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C STRICT;
    
  5. 最後,必須使用以下命令宣告 PL:

    CREATE [TRUSTED] LANGUAGE language_name
        HANDLER handler_function_name
        [INLINE inline_function_name]
        [VALIDATOR validator_function_name] ;
    

    可選關鍵字 TRUSTED 指定該語言不授予使用者本來無法訪問的資料。受信任的語言是為普通資料庫使用者(沒有超級使用者許可權的使用者)設計的,並允許他們安全地建立函式和過程。由於 PL 函式在資料庫伺服器內部執行,因此 TRUSTED 標誌只能用於不允許訪問資料庫伺服器內部或檔案系統的語言。PL/pgSQLPL/TclPL/Perl 被認為是受信任的;PL/TclUPL/PerlUPL/PythonU 的設計目的是提供無限功能,並且 應該被標記為受信任。

示例 40.1  展示了手動安裝過程如何與 PL/Perl 語言配合使用。

示例 40.1. 手動安裝 PL/Perl

以下命令告訴資料庫伺服器在哪裡可以找到 PL/Perl 語言呼叫處理器函式的共享物件

CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
    '$libdir/plperl' LANGUAGE C;

PL/Perl 有一個內聯處理器函式和一個驗證器函式,所以我們也宣告它們

CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;

CREATE FUNCTION plperl_validator(oid) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;

命令

CREATE TRUSTED LANGUAGE plperl
    HANDLER plperl_call_handler
    INLINE plperl_inline_handler
    VALIDATOR plperl_validator;

然後定義,在語言屬性為 plperl 的函式和過程中呼叫先前宣告的函式。


在預設的 PostgreSQL 安裝中,PL/pgSQL 語言的處理器被編譯並安裝到“”目錄中;此外,PL/pgSQL 語言本身就安裝在所有資料庫中。如果配置了 Tcl 支援,PL/TclPL/TclU 的處理器會被編譯並安裝到庫目錄中,但該語言本身預設不會安裝到任何資料庫中。同樣,如果配置了 Perl 支援,PL/PerlPL/PerlU 的處理器會被編譯並安裝,如果配置了 Python 支援,PL/PythonU 的處理器會被安裝,但這些語言預設不會被安裝。

提交更正

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