Chapter 36. 過程語言

PostgreSQL 允許用戶增加新的編程語言, 並且可以用這些語言寫函數和過程。這些語言叫過程語言(PL)。 如果我們用一種過程語言 書寫了一個函數或者觸發器, 那麼數據庫服務器是沒有任何內建的知識獲知如何解析該函數的源文本的。 實際上這些任務都傳遞給一個知道如何處理這些細節的句柄處理。 這個句柄既可以自己幹所有的分析,語法分析,執行等的工作,也可以充當PostgreSQL 和一種現有的編程語言實現之間的"膠水"。句柄本身是一個特殊的 C 語言函數, 它被編譯成一種共享對象並且在需要的時候裝載。

為一種新的過程語言(PL)書寫一個句柄的論題在 Chapter 47 裡描述。 標準的 PostgreSQL 版本裡可以直接獲得幾種過程語言可以直接。

36.1. 安裝過程語言

如果你要使用某種過程語言,那麼你必須把它"安裝"到要用它的數據庫裡。 不過那些安裝到數據庫 template1 裡的過程語言會自動在隨後創建的數據庫中安裝。 因此數據庫管理員可以決定哪個數據庫可以使用哪門語言,以及可以決定缺省時可以使用哪些語言。

對于那些隨著標準版本發布的語言,你可以使用 createlang 程序來安裝語言而不用自己事無巨細的自己做。 比如,要安裝PL/pgSQLtemplate1 數據庫中,使用

createlang plpgsql template1

下面描述的手工安裝的方法只是適用于那些 createlang 還不知道的客戶語言。

手工的過程語言安裝

一個過程語言是按三個步驟安裝到數據庫裡面去的, 這些任務必須由數據庫超級用戶執行。 createlang 程序把 step 2step 3 自動化了。

  1. 我們必須被編譯和安裝該語言句柄的共享對象(目標)必須安裝到一個合適的庫目錄。 這裡用的方法和制作安裝用戶定義的 C 函數的方法是一樣的。見 Section 33.7.6

  2. 句柄必須用下面命令聲明

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

    特殊的返回類型 language_handler 告訴數據庫系統, 這個函數並不返回一個已定義的 SQL 數據類型並且是不能直接在 SQL 語句裡面使用。

  3. PL 必須用下面命令定義

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE 'language-name'
        HANDLER handler_function_name
        LANCOMPILER 'description';

    可選的關鍵字 TRUSTED 聲明一個沒有超級用戶權限的普通數據庫用戶能否使用這種語言創建函數和觸發器過程。 因為 PL 函數在數據庫後端內部執行,所以TRUSTED標志應該只是用于那些不允許訪問數據庫服務器內部或文件系統的語言。 語言PL/pgSQLPL/TclPL/Perl以及 PL/Python都被認為是可信的。 PL/TclUPL/PerlU,和 PL/PythonU 是設計成提供無限的功能地,因此應該標記為可信的。

Example 36-1 顯示了手工過程如何安裝 PL/pgSQL 語言。

Example 36-1. 手工安裝 PL/pgSQL

下面的命令告訴數據庫到那裡才能找到用于 PL/pgSQL語言的調用句柄函數的共享對象(目標)。

CREATE FUNCTION plpgsql_call_handler () RETURNS language_handler AS
    '$libdir/plpgsql' LANGUAGE C;

下面的命令

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
    HANDLER plpgsql_call_handler
    LANCOMPILER 'PL/pgSQL';

聲明了前面所定義的調用句柄函數應該是在調用語言屬性是 plpgsql的函數,或觸發器過程被調用的時候使用。

在缺省的 PostgreSQL 安裝裡,PL/pgSQL 語言的句柄是制作並安裝到 "library" 目錄中去的。如果配置了 Tcl/Tk 支持,那麼 PL/TclPL/TclU 的句柄也都制作並安裝到同一個 未知。類似的還有,如果配置了 Perl,那麼PL/PerlPL/PerlU 句柄都會得到制作和安裝; 如果配置了 Python,則制作安裝 PL/PythonU