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