CREATE LANGUAGE — 定義一個新的程序語言
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
CREATE LANGUAGE
在 PostgreSQL 資料庫中註冊一個新的程序語言。 隨後,可以使用這個新的語言來定義函數和程序。
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 LANGUAGE
是 PostgreSQL 的擴充功能。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。