Chapter 34. 過程語言

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

目前在標準的 PostgreSQL 發佈裡有四種過程語言可用: PL/pgSQLChapter 35), PL/TclChapter 36), PL/PerlChapter 37),和 PL/PythonChapter 38)。 用戶可以定義其它語言。開發一種新的過程語言的基本訊息在 Chapter 45 裡介紹。

還有幾種額外的過程語言沒有包含在核心發佈裡。Appendix H 裡面有如何找到它們的訊息。

34.1. 安裝過程語言

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

對於那些隨著標準版本發佈的語言,您可以使用 createlang 程序來安裝語言而不用自己事無鉅細的自己做。 比如,要安裝PL/pgSQLtemplate1 資料庫中,使用

createlang plpgsql template1

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

手工的過程語言安裝

一個過程語言是按四個步驟安裝到資料庫裡面去的, 這些任務必須由資料庫超級用戶執行。 createlang 程序把除了 step 1 之外的都自動化了。

  1. 我們必須被編譯和安裝該語言句柄的共享對像(目標)必須安裝到一個合適的庫目錄。 這裡用的方法和製作安裝用戶定義的 C 函數的方法是一樣的。見 Section 31.9.6。 通常,語言句柄需要外部的庫提供實際的編程語言引擎;如果是這樣,那麼那些庫也必須安裝。

  2. 語言句柄可以提供一個"驗證器"函數,這個函數檢查函數定義是否正確, 而不會實際執行它。如果存在驗證器函數,那麼由 CREATE FUNCTION 調用。 如果一個驗證器函數由句柄提供,那麼用下面的命令聲明

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;

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

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE 'language-name'
        HANDLER handler_function_name
        [VALIDATOR validator_function_name] ;

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

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

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

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

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

PL/pgSQL 有一個驗證器函數,所以我們還要聲明它:

CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS
    '$libdir/plpgsql' LANGUAGE C;

下面的命令

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
    HANDLER plpgsql_call_handler
    VALIDATOR plpgsql_validator;

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

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