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 / 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 LANGUAGE 將一個新的過程語言註冊到一個 PostgreSQL 資料庫。之後,就可以用這種新語言定義函式和過程了。

CREATE LANGUAGE 有效地將語言名稱與負責執行以該語言編寫的函式的處理函式關聯起來。有關語言處理程式的更多資訊,請參閱 第 57 章

CREATE OR REPLACE LANGUAGE 將會建立一種新語言,或者替換一個現有的定義。如果該語言已存在,則根據命令更新其引數,但語言的所有權和許可權設定不會改變,並且假定該語言中已有的所有函式仍然有效。

必須擁有 PostgreSQL 超級使用者許可權才能註冊新語言或更改現有語言的引數。但是,一旦建立了該語言,就可以將其所有權分配給非超級使用者,該非超級使用者隨後可以刪除它、更改其許可權、重新命名它或將其分配給新所有者。(但不要將底層 C 函式的所有權分配給非超級使用者;這會為該使用者建立一個特權升級途徑。)

不提供任何處理函式的 CREATE LANGUAGE 形式已過時。為了向後相容舊的轉儲檔案,它被解釋為 CREATE EXTENSION。如果該語言已打包成同名的擴充套件,那麼這會起作用,這也是設定過程語言的常規方法。

引數

TRUSTED

TRUSTED 指定該語言不授予使用者原本無法訪問的資料的訪問許可權。如果在註冊語言時省略此關鍵字,則只有擁有 PostgreSQL 超級使用者許可權的使用者才能使用該語言建立新函式。

PROCEDURAL

這是一個噪聲詞。

name

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

HANDLER call_handler

call_handler 是一個先前已註冊的函式,該函式將被呼叫來執行該過程語言的函式。過程語言的呼叫處理程式必須用編譯型語言(如 C)編寫,並使用版本 1 呼叫約定,並向 PostgreSQL 註冊為一個不接受引數且返回 language_handler 型別的函式。`language_handler` 是一個佔位符型別,僅用於標識該函式為呼叫處理程式。

INLINE inline_handler

inline_handler 是一個先前已註冊的函式,該函式將被呼叫來執行該語言中的匿名程式碼塊(DO 命令)。如果未指定 inline_handler 函式,則該語言不支援匿名程式碼塊。處理函式必須接受一個 internal 型別的引數,該引數將是 DO 命令的內部表示形式,並且通常返回 void。處理函式的返回值將被忽略。

VALIDATOR valfunction

valfunction 是一個先前已註冊的函式,當建立該語言的新函式時,該函式將被呼叫來驗證新函式。如果未指定驗證器函式,則在建立新函式時不會對其進行檢查。驗證器函式必須接受一個 oid 型別的引數,該引數將是要建立函式的 OID,並且通常返回 void

驗證器函式通常會檢查函式體是否存在語法錯誤,但它也可以檢查函式的其他屬性,例如該語言是否無法處理某些引數型別。要發出錯誤訊號,驗證器函式應使用 ereport() 函式。該函式的返回值將被忽略。

註釋

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

系統目錄 pg_language(請參閱 第 52.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 LANGUAGE 是一個 PostgreSQL 擴充套件。

提交更正

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