CREATE PROCEDURE — 定義一個新過程
CREATE [ OR REPLACE ] PROCEDUREname
( [ [argmode
] [argname
]argtype
[ { DEFAULT | = }default_expr
] [, ...] ] ) { LANGUAGElang_name
| TRANSFORM { FOR TYPEtype_name
} [, ... ] | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | SETconfiguration_parameter
{ TOvalue
| =value
| FROM CURRENT } | AS 'definition
' | AS 'obj_file
', 'link_symbol
' |sql_body
} ...
CREATE PROCEDURE
用於定義一個新的過程。CREATE OR REPLACE PROCEDURE
會建立一個新過程,或者替換現有的定義。要能夠定義一個過程,使用者必須對該語言具有 USAGE
許可權。
如果包含模式名,則該過程將在指定的模式中建立。否則,它將在當前模式中建立。新過程的名稱不能與同一模式中具有相同輸入引數型別的現有過程或函式匹配。但是,不同引數型別的過程和函式可以共享一個名稱(這稱為過載)。
要替換現有過程的當前定義,請使用CREATE OR REPLACE PROCEDURE
。無法透過這種方式更改過程的名稱或引數型別(如果您嘗試這樣做,實際上是建立了一個新的、不同的過程)。
當使用CREATE OR REPLACE PROCEDURE
替換現有過程時,該過程的所有權和許可權不會改變。所有其他過程屬性都將被賦值或暗示為命令中指定的值。您必須擁有該過程才能替換它(這包括成為擁有角色的成員)。
建立該過程的使用者將成為該過程的所有者。
要能夠建立過程,您必須對引數型別具有USAGE
許可權。
有關編寫過程的更多資訊,請參閱第 36.4 節。
name
要建立的過程的名稱(可選地指定模式)。
argmode
引數的模式:IN
、OUT
、INOUT
或 VARIADIC
。如果省略,則預設為IN
。
argname
引數的名稱。
argtype
過程的引數的資料型別(可選地指定模式),如果有的話。引數型別可以是基本型別、複合型別或域型別,或者可以引用表列的型別。
根據實現語言,可能還允許指定“偽型別”,如cstring
。偽型別表示實際引數型別要麼不完整指定,要麼超出了普通 SQL 資料型別的集合。
透過編寫
來引用列的型別。使用此功能有時有助於使過程獨立於表定義的更改。table_name
.column_name
%TYPE
default_expr
如果未指定引數,則用作預設值的表示式。該表示式必須可以強制轉換為引數的引數型別。具有預設值的引數之後的所有輸入引數也必須具有預設值。
lang_name
過程實現所在的語言名稱。它可以是sql
、c
、internal
,或者使用者定義的程式語言的名稱,例如plpgsql
。如果指定了sql_body
,則預設為sql
。用單引號括起名稱是棄用的,需要匹配大小寫。
TRANSFORM { FOR TYPE type_name
} [, ... ] }
列出過程呼叫應應用的轉換。轉換在 SQL 型別和特定於語言的資料型別之間進行轉換;請參閱CREATE TRANSFORM。過程語言實現通常對內建型別有硬編碼的知識,因此這些型別不需要在此列出。如果過程語言實現不知道如何處理某個型別並且未提供轉換,它將回退到轉換資料型別的預設行為,但這取決於實現。
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER
表示該過程將以呼叫它的使用者的許可權執行。這是預設設定。SECURITY DEFINER
指定該過程將以擁有它的使用者的許可權執行。
關鍵字EXTERNAL
是為符合 SQL 標準而允許的,但它是可選的,因為與 SQL 不同,此功能適用於所有過程,而不僅僅是外部過程。
一個SECURITY DEFINER
過程不能執行事務控制語句(例如,根據語言,COMMIT
和ROLLBACK
)。
configuration_parameter
value
SET
子句會導致在進入過程時將指定的配置引數設定為指定的值,然後在過程退出時恢復到其先前的值。SET FROM CURRENT
儲存執行CREATE PROCEDURE
時當前的值作為進入過程時要應用的值。
如果SET
子句附加到過程,則在該過程內執行的SET LOCAL
命令對同一變數的影響僅限於該過程:在過程退出時仍會恢復配置引數的先前值。但是,普通的SET
命令(不帶LOCAL
)會覆蓋SET
子句,正如它會覆蓋之前的SET LOCAL
命令一樣:此類命令的效果在過程退出後仍然存在,除非當前事務被回滾。
如果SET
子句附加到過程,那麼該過程不能執行事務控制語句(例如,根據語言,COMMIT
和ROLLBACK
)。
definition
定義該過程的字串常量;含義取決於語言。它可以是內部過程名、物件檔案路徑、SQL 命令或程式語言中的文字。
為了方便起見,通常使用美元引用(請參閱第 4.1.2.4 節)來編寫過程定義字串,而不是普通的單引號語法。沒有美元引用,過程定義中的任何單引號或反斜槓都必須透過加倍來轉義。
obj_file
, link_symbol
AS 子句的這種形式用於動態可載入的 C 語言過程,當 C 語言原始碼中的過程名與 SQL 過程名不同時。字串obj_file
是包含編譯後的 C 過程的共享庫檔案的名稱,並根據LOAD
命令進行解釋。字串link_symbol
是過程的連結符號,即 C 語言原始碼中的過程名。如果省略連結符號,則假定它與正在定義的過程的 SQL 過程名稱相同。
當重複的CREATE PROCEDURE
呼叫引用同一個物件檔案時,該檔案每個會話只加載一次。要解除安裝和重新載入檔案(可能在開發過程中),請啟動一個新會話。
sql_body
LANGUAGE SQL
過程的主體。這應該是一個程式碼塊
BEGIN ATOMICstatement
;statement
; ...statement
; END
這與將過程主體文字寫為字串常量(參見上面的definition
)類似,但有一些區別:這種形式僅適用於LANGUAGE SQL
,而字串常量形式適用於所有語言。這種形式在過程定義時解析,字串常量形式在執行時解析;因此,這種形式不支援多型引數型別和其他在過程定義時無法解析的構造。這種形式跟蹤過程與過程主體中使用的物件之間的依賴關係,因此DROP ... CASCADE
將正常工作,而使用字串字面量的形式可能會留下懸空的過程。最後,這種形式與 SQL 標準和其他 SQL 實現的相容性更好。
CREATE PROCEDURE insert_data(a integer, b integer) LANGUAGE SQL AS $$ INSERT INTO tbl VALUES (a); INSERT INTO tbl VALUES (b); $$;
或
CREATE PROCEDURE insert_data(a integer, b integer) LANGUAGE SQL BEGIN ATOMIC INSERT INTO tbl VALUES (a); INSERT INTO tbl VALUES (b); END;
並像這樣呼叫
CALL insert_data(1, 2);
SQL 標準中定義了CREATE PROCEDURE
命令。PostgreSQL 實現可以以相容的方式使用,但有許多擴充套件。有關詳細資訊,另請參閱CREATE FUNCTION。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。