W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
CREATE PROCEDURE — 定義一個(gè)新的過(guò)程
CREATE [ OR REPLACE ] PROCEDURE
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) { LANGUAGE
lang_name | TRANSFORM { FOR TYPE
type_name } [, ... ] | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | SET
configuration_parameter
{ TO value | = value | FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ...
CREATE PROCEDURE
定義一個(gè)新的過(guò)程。CREATE OR REPLACE PROCEDURE
將會(huì)創(chuàng)建一個(gè)新過(guò)程或者替換一個(gè)已有的定義。為了能夠定義過(guò)程,用戶必須具有所使用的語(yǔ)言上的USAGE
特權(quán)。
如果這個(gè)命令中包括了一個(gè)方案名稱,則該過(guò)程將被創(chuàng)建在該方案中。否則過(guò)程將被創(chuàng)建在當(dāng)前的方案中。新過(guò)程的名稱不能匹配同一方案中具有相同輸入?yún)?shù)類型的任何現(xiàn)有過(guò)程或函數(shù)。不過(guò),具有不同參數(shù)類型的過(guò)程和函數(shù)可以共享同一個(gè)名稱(這被稱為重載)。
要替換一個(gè)已有過(guò)程的當(dāng)前定義,請(qǐng)使用CREATE OR REPLACE PROCEDURE
。不能用這種方式更改過(guò)程的名稱或者參數(shù)類型(如果嘗試這樣做,實(shí)際上會(huì)創(chuàng)建一個(gè)新的、不同的過(guò)程)。
當(dāng)CREATE OR REPLACE PROCEDURE
被用來(lái)替換一個(gè)現(xiàn)有的過(guò)程時(shí),該過(guò)程的擁有關(guān)系和權(quán)限保持不變。所有其他的過(guò)程屬性會(huì)被賦予這個(gè)命令中指定的或者暗示的值。必須擁有(包括成為擁有角色的成員)該過(guò)程才能替換它。
創(chuàng)建過(guò)程的用戶將成為該過(guò)程的擁有者。
為了能夠創(chuàng)建一個(gè)過(guò)程,用戶必須具有參數(shù)類型上的USAGE
特權(quán)。
name
要?jiǎng)?chuàng)建的過(guò)程的名稱(可以是被方案限定的)。
argmode
參數(shù)的模式可以是:IN
、INOUT
或者VARIADIC
。如果省略,則默認(rèn)為IN
(當(dāng)前對(duì)過(guò)程不支持OUT
參數(shù),可使用INOUT
)。
argname
參數(shù)的名稱。
argtype
過(guò)程的參數(shù)(如果有)的數(shù)據(jù)類型(可以是被方案限定的)。參數(shù)類型可以是基礎(chǔ)類型、組合類型或者域類型,或者可以引用一個(gè)表列的類型。
根據(jù)具體的實(shí)現(xiàn)語(yǔ)言,還可能可以指定“偽類型”,例如cstring
。偽類型表示實(shí)際的參數(shù)類型沒(méi)有完全確定,或者是位于普通SQL數(shù)據(jù)類型的集合之外。
寫(xiě)上
可以引用某個(gè)列的類型。使用這種特性有時(shí)可以讓過(guò)程不受表定義改變的影響。table_name
.column_name
%TYPE
default_expr
沒(méi)有指定參數(shù)時(shí)要被用作默認(rèn)值的表達(dá)式。這個(gè)表達(dá)式必須符合該參數(shù)的參數(shù)類型。跟在有默認(rèn)值的參數(shù)后面的輸入?yún)?shù)也都必須有默認(rèn)值。
lang_name
用于實(shí)現(xiàn)該過(guò)程的語(yǔ)言名稱。它可以是sql
、c
、internal
或者一種用戶定義的過(guò)程語(yǔ)言的名稱,例如plpgsql
。將名稱包裹在單引號(hào)內(nèi)的方式已經(jīng)被廢棄,并且要求大小寫(xiě)匹配。
TRANSFORM { FOR TYPE type_name
} [, ... ] }
列出對(duì)過(guò)程的調(diào)用應(yīng)該應(yīng)用哪些Transform。Transform負(fù)責(zé)在SQL類型和語(yǔ)言相關(guān)的數(shù)據(jù)類型之間進(jìn)行轉(zhuǎn)換,請(qǐng)參考CREATE TRANSFORM。過(guò)程語(yǔ)言實(shí)現(xiàn)通常采用硬編碼的方式保存內(nèi)建類型的知識(shí),因此它們無(wú)需在這里列出。但如果一種過(guò)程語(yǔ)言實(shí)現(xiàn)不知道如何處理一種類型并且沒(méi)有提供Transform,它將回退到默認(rèn)的行為來(lái)轉(zhuǎn)換數(shù)據(jù)類型,但是這依賴于其實(shí)現(xiàn)。
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER
指示過(guò)程以調(diào)用它的用戶的特權(quán)來(lái)執(zhí)行。這是默認(rèn)方式。SECURITY DEFINER
指定過(guò)程以擁有它的用戶的特權(quán)來(lái)執(zhí)行。
為了符合SQL標(biāo)注,允許使用EXTERNAL
關(guān)鍵詞,但它是可選的,因?yàn)楹蚐QL中不同,這個(gè)特性適用于所有的過(guò)程而不僅僅是外部過(guò)程。
SECURITY DEFINER
過(guò)程不能執(zhí)行事務(wù)控制語(yǔ)句(例如COMMIT
和ROLLBACK
,具體取決于實(shí)現(xiàn)的語(yǔ)言)。
configuration_parameter
value
SET
子句導(dǎo)致在進(jìn)入該過(guò)程時(shí)指定的配置參數(shù)被設(shè)置為指定的值,并且在過(guò)程退出時(shí)恢復(fù)到之前的值。SET FROM CURRENT
把CREATE PROCEDURE
執(zhí)行時(shí)該參數(shù)的當(dāng)前值保存為在進(jìn)入該過(guò)程時(shí)要應(yīng)用的值。
如果對(duì)過(guò)程附加一個(gè)SET
子句,那么在該過(guò)程中為同一個(gè)變量執(zhí)行的SET LOCAL
命令的效果就被限制于該過(guò)程:在過(guò)程退出時(shí)還是會(huì)恢復(fù)到該配置參數(shù)的以前的值。不過(guò),一個(gè)普通的SET
命令(沒(méi)有LOCAL
)會(huì)重載這個(gè)SET
子句,很像它對(duì)一個(gè)之前的
SET LOCAL
命令所做的事情:這樣一個(gè)命令的效果將持續(xù)到過(guò)程退出之后,除非當(dāng)前事務(wù)被回滾。
如果對(duì)過(guò)程附加一個(gè)SET
子句,則該過(guò)程不能執(zhí)行事務(wù)控制語(yǔ)句(例如COMMIT
和ROLLBACK
,具體取決于實(shí)現(xiàn)的語(yǔ)言)。
definition
一個(gè)定義該過(guò)程的字符串常量,其含義取決于語(yǔ)言。它可以是一個(gè)內(nèi)部的過(guò)程名、一個(gè)對(duì)象文件的路徑、一個(gè)SQL命令或者以一種過(guò)程語(yǔ)言編寫(xiě)的文本。
在編寫(xiě)過(guò)程的定義字符串時(shí),使用美元引用(見(jiàn)第 4.1.2.4 節(jié))而不是普通的單引號(hào)語(yǔ)法常常會(huì)很有幫助。如果沒(méi)有美元引用,過(guò)程定義中的任何單引號(hào)或者反斜線必須以雙寫(xiě)的方式進(jìn)行轉(zhuǎn)義。
obj_file
, link_symbol
當(dāng)C語(yǔ)言源碼中的過(guò)程名與SQL過(guò)程的名稱不同時(shí),這種形式的AS
子句被用于動(dòng)態(tài)可裝載的C語(yǔ)言過(guò)程。字符串obj_file
是包含已編譯好的C過(guò)程的共享庫(kù)文件名,并且被按照LOAD命令的方式解析。字符串
link_symbol
是該過(guò)程的鏈接符號(hào),也就是該過(guò)程在C語(yǔ)言源代碼中的名稱。如果鏈接符號(hào)被省略,則會(huì)被假定為與正在被定義的SQL過(guò)程的名稱相同。
當(dāng)重復(fù)的CREATE PROCEDURE
調(diào)用引用同一個(gè)對(duì)象文件時(shí),只會(huì)對(duì)每一個(gè)會(huì)話裝載該文件一次。要卸載或者重新載入該文件(可能是在開(kāi)發(fā)期間),應(yīng)該開(kāi)始一個(gè)新的會(huì)話。
CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
CALL insert_data(1, 2);
SQL標(biāo)準(zhǔn)中定義有一個(gè)CREATE PROCEDURE
命令。PostgreSQL的版本類似但是并不完全兼容。詳情請(qǐng)見(jiàn)CREATE FUNCTION。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: