支援版本:目前 (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 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CREATE LANGUAGE

CREATE LANGUAGE — 定義一個新的程序語言

概要

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name

描述

CREATE LANGUAGEPostgreSQL 資料庫中註冊一個新的程序語言。 隨後,可以使用這個新的語言來定義函數和程序。

CREATE LANGUAGE 有效地將語言名稱與處理函數相關聯,這些處理函數負責執行用該語言編寫的函數。 有關語言處理常式的更多資訊,請參閱第 56 章

CREATE OR REPLACE LANGUAGE 將建立一個新的語言,或取代現有的定義。 如果該語言已存在,則會根據命令更新其參數,但該語言的所有權和權限設定不會變更,並且假定以該語言編寫的任何現有函數仍然有效。

必須具有 PostgreSQL 超級使用者權限才能註冊新的語言或變更現有語言的參數。 但是,一旦建立語言,就可以將其所有權分配給非超級使用者,然後該使用者可以刪除它、變更其權限、重新命名它或將其分配給新的擁有者。 (但是,不要將基礎 C 函數的所有權分配給非超級使用者;這將為該使用者建立一個權限提升路徑。)

不提供任何處理函數的CREATE LANGUAGE 形式已過時。 為了與舊的轉儲檔案向後相容,它被解釋為 CREATE EXTENSION。 如果該語言已打包到同名的擴充功能中,這將起作用,這是設定程序語言的傳統方式。

參數

TRUSTED

TRUSTED 指定該語言不會授予對使用者原本無法存取的資料的存取權。 如果在註冊該語言時省略此關鍵字,則只有具有 PostgreSQL 超級使用者權限的使用者才能使用此語言來建立新的函數。

PROCEDURAL

這是一個無意義的詞。

name

新程序語言的名稱。 該名稱在資料庫中的語言中必須是唯一的。

HANDLER call_handler

call_handler 是先前註冊的函數的名稱,將呼叫該函數以執行程序語言的函數。 程序語言的呼叫處理常式必須使用版本 1 呼叫慣例以編譯語言(例如 C)編寫,並使用 PostgreSQL 註冊為不帶任何參數並傳回 language_handler 類型的函數,這是一個預留位置類型,僅用於將該函數識別為呼叫處理常式。

INLINE inline_handler

inline_handler 是先前註冊的函數的名稱,將呼叫該函數以執行此語言中的匿名程式碼區塊(DO 指令)。 如果未指定 inline_handler 函數,則該語言不支援匿名程式碼區塊。 處理常式函數必須採用一個 internal 類型的參數,該參數將是 DO 指令的內部表示,並且通常會傳回 void。 處理常式的傳回值將被忽略。

VALIDATOR valfunction

valfunction 是先前註冊的函數的名稱,當以該語言建立新函數時,將呼叫該函數以驗證新函數。 如果未指定驗證器函數,則在建立新函數時不會對其進行檢查。 驗證器函數必須採用一個 oid 類型的參數,該參數將是要建立的函數的 OID,並且通常會傳回 void

驗證器函數通常會檢查函數主體是否具有語法正確性,但它也可以查看函數的其他屬性,例如,如果該語言無法處理某些引數類型。 若要發出錯誤訊號,驗證器函數應使用 ereport() 函數。 該函數的傳回值將被忽略。

備註

使用 DROP LANGUAGE 來刪除程序語言。

系統目錄 pg_language(參閱第 51.29 節)記錄了目前已安裝語言的相關資訊。此外,psql 指令 \dL 也會列出已安裝的語言。

若要在程序語言中建立函式,使用者必須具有該語言的 USAGE 權限。預設情況下,對於受信任的語言,USAGE 權限會授予 PUBLIC(即所有人)。如果需要,可以撤銷此權限。

程序語言是特定於個別資料庫的。但是,可以將語言安裝到 template1 資料庫中,這會使其自動在所有後續建立的資料庫中可用。

範例

建立新程序語言的最簡步驟如下:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

通常,這會寫在擴充功能的建立腳本中,使用者會這樣做來安裝擴充功能:

CREATE EXTENSION plsample;

相容性

CREATE LANGUAGEPostgreSQL 的擴充功能。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。