?
This document uses PHP Chinese website manual Release
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE name CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE LANGUAGE通過一個PostgreSQL 數(shù)據(jù)庫注冊了一個新的程序語言。后來,函數(shù)和觸發(fā)器程序可以通過這個新語言定義。
CREATE LANGUAGE有效地用處理程序函數(shù)關(guān)聯(lián)語言名稱,其中 這些處理程序函數(shù)是負(fù)責(zé)執(zhí)行用該語言寫的函數(shù)的。參考Chapter 49 獲取更多關(guān)于語言處理程序的信息。
有兩種形式的CREATE LANGUAGE命令。第一種形式, 用戶只提供需要的語言的名字,然后PostgreSQL 服務(wù)器參考pg_pltemplate 系統(tǒng)表來判斷正確的參數(shù)。第二種形式,用戶把語言參數(shù)和語言名字一起提供。 第二種形式可以用于創(chuàng)建沒有在pg_pltemplate里面定義的語言, 不過這種方法被認(rèn)為已經(jīng)過時了。
如果服務(wù)器在pg_pltemplate系統(tǒng)表里面找到給出的語言名字 的紀(jì)錄,那么它將使用系統(tǒng)表的數(shù)據(jù),即使命令包含語言參數(shù)也如此。 這個行為簡化了加載舊的轉(zhuǎn)儲文件的過程,因為這些轉(zhuǎn)儲文件很可能包含有關(guān) 語言支持函數(shù)的過時信息。
通常地,用戶必須有PostgreSQL超級用戶權(quán)限 來注冊一個新語言。然而,數(shù)據(jù)庫的所有者能在那個數(shù)據(jù)庫內(nèi)注冊一個新語言, 若該語言被列入pg_pltemplate目錄并被標(biāo)記為 允許被數(shù)據(jù)庫所有者創(chuàng)建(tmpldbacreate為真)。默認(rèn)是 信任的語言可以通過數(shù)據(jù)庫所有者來創(chuàng)建,但這可以被超級用戶通過更改 pg_pltemplate的內(nèi)容來調(diào)整。一個語言的創(chuàng)建者 變成了其所有者并且可以刪除它、重命名它或者將它分配給一個新的所有者。
CREATE OR REPLACE LANGUAGE將會要么創(chuàng)建一個新語言要么替代 一個已有定義。如果語言已經(jīng)存在,它的參數(shù)會根據(jù)來自pg_pltemplate 的值來更新,但是語言的所屬關(guān)系和許可設(shè)置不會更改,并且任何用該語言寫的程序 都假定為仍然有效。除了請求創(chuàng)建一種語言的常規(guī)權(quán)限,要獲得其他權(quán)限用戶必須是 現(xiàn)有語言的超級用戶或者所有者。REPLACE主要是用來確保語言存在的。 若語言有pg_pltemplate條目,那么 pg_pltemplate實際上并不能改變?nèi)魏维F(xiàn)有的定義,除了在 不尋常的情況下,像pg_pltemplate條目在語言創(chuàng)建后被更改。
TRUSTED說明對該語言的調(diào)用處理器是安全的; 也就是說,它不會提供給非特權(quán)用戶任何繞過訪問限制的能力。如果 忽略這個關(guān)鍵字,只有PostgreSQL超級 用戶可以使用這個語言創(chuàng)建新函數(shù)。
這是個沒有用的字
新過程語言的名稱。語言名是大小寫無關(guān)的。這個名字應(yīng)該在數(shù)據(jù)庫 的所有語言中唯一。
出于向下兼容的原因,這個名字可以用單引號包圍。
call_handler是 一個以前注冊過的函數(shù)名字,該函數(shù)將被用來執(zhí)行該過程語言的函數(shù)。 過程語言的調(diào)用處理器必須用一種編譯語言(比如 C)書寫,調(diào)用風(fēng)格 必須是版本-1 的調(diào)用風(fēng)格,并且注冊為不接受參數(shù)并且返回 language_handler類型的函數(shù)。language_handler 是用于將函數(shù)聲明為調(diào)用處理器的占位符。
inline_handler是一個先前 已注冊的函數(shù)的名稱,且該函數(shù)將會通過該語言被調(diào)用來執(zhí)行一個匿名代碼塊 (DO命令)。若未指定 inline_handler函數(shù),那么該 語言將不支持匿名代碼塊。處理程序函數(shù)必須帶有internal類型 參數(shù),這將會作為DO命令的內(nèi)部表征,并且通常會返回void。 忽略處理程序的返回值會。
valfunction是一個 以前注冊過的函數(shù)名字,在用該語言創(chuàng)建新函數(shù)的時候?qū)⒂盟鼇硇r炐潞瘮?shù)。 如果沒有聲明校驗函數(shù),那么建立新函數(shù)的時候就不會檢查它。校驗函數(shù)必 須接受一個類型為oid的參數(shù),它是將要創(chuàng)建的函數(shù)的 OID , 并且通常會返回void。
校驗函數(shù)通常會檢查函數(shù)體,看看有沒有語法錯誤,但是它也可以查看函數(shù)
的其它屬性,比如該語言是否不能處理某種參數(shù)類型。校驗函數(shù)應(yīng)該用
ereport()
函數(shù)報告錯誤。該函數(shù)的返回值將被忽略。
如果服務(wù)器在pg_pltemplate系統(tǒng)表里有對應(yīng)名稱的語言紀(jì)錄, 那么TRUSTED選項和支持函數(shù)的名字等參數(shù)將被忽略。
createlang程序是對CREATE LANGUAGE命令的 一個簡單封裝。降低了在 shell 命令行上安裝過程語言的難度
使用DROP LANGUAGE命令,或者更好是 droplang程序來刪除一個過程語言。
系統(tǒng)表pg_language
(參閱節(jié)
Section 45.24)記錄了更多有關(guān)當(dāng)前安裝
的過程語言的信息。createlang也有一個選項
列出已安裝的語言。
要使用一種過程語言創(chuàng)建函數(shù),用戶必須對該語言有USAGE 權(quán)限。缺省時,對于可信的語言,USAGE是賦與PUBLIC (也就是每個人)的。需要時,這個權(quán)限可以撤銷。
過程語言是對每個獨立數(shù)據(jù)庫本地創(chuàng)建的。不過,語言可以安裝到 template1里面,這樣就會導(dǎo)致它自動在所有 隨后創(chuàng)建的數(shù)據(jù)庫里可用。
調(diào)用處理程序函數(shù),內(nèi)聯(lián)處理函數(shù)(若存在),以及驗證器函數(shù)(若存在)必須是 已存在的,若服務(wù)器在pg_pltemplate中沒有語言的記錄。 但是當(dāng)有一條記錄時,這個函數(shù)不需要提前存在;若不在數(shù)據(jù)庫中,這些函數(shù)將會 被自動定義。(若實現(xiàn)語言的共享庫不出現(xiàn)在安裝過程中,這會導(dǎo)致 CREATE LANGUAGE失敗。)
在PostgreSQL之前,必須聲明處理器函數(shù) 返回占位類型opaque,而不是language_handler。 為了支持加載舊的轉(zhuǎn)儲文件,CREATE LANGUAGE還將接受聲明 為返回opaque的函數(shù),但是它會發(fā)出一條通知并且把函數(shù)的返回 類型改為language_handler。
創(chuàng)建標(biāo)準(zhǔn)的過程語言的比較好的方法:
CREATE LANGUAGE plperl;
對于pg_pltemplate還不知道的語言,需要下面這樣的序列:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
CREATE LANGUAGE是PostgreSQL擴展