2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前18)/ 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11

CREATE PROCEDURE

CREATE PROCEDURE — 定義一個新過程

概要

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'
    | sql_body
  } ...

描述

CREATE PROCEDURE 用於定義一個新的過程。CREATE OR REPLACE PROCEDURE 會建立一個新過程,或者替換現有的定義。要能夠定義一個過程,使用者必須對該語言具有 USAGE 許可權。

如果包含模式名,則該過程將在指定的模式中建立。否則,它將在當前模式中建立。新過程的名稱不能與同一模式中具有相同輸入引數型別的現有過程或函式匹配。但是,不同引數型別的過程和函式可以共享一個名稱(這稱為過載)。

要替換現有過程的當前定義,請使用CREATE OR REPLACE PROCEDURE。無法透過這種方式更改過程的名稱或引數型別(如果您嘗試這樣做,實際上是建立了一個新的、不同的過程)。

當使用CREATE OR REPLACE PROCEDURE替換現有過程時,該過程的所有權和許可權不會改變。所有其他過程屬性都將被賦值或暗示為命令中指定的值。您必須擁有該過程才能替換它(這包括成為擁有角色的成員)。

建立該過程的使用者將成為該過程的所有者。

要能夠建立過程,您必須對引數型別具有USAGE許可權。

有關編寫過程的更多資訊,請參閱第 36.4 節

引數

name

要建立的過程的名稱(可選地指定模式)。

argmode

引數的模式:INOUTINOUTVARIADIC。如果省略,則預設為IN

argname

引數的名稱。

argtype

過程的引數的資料型別(可選地指定模式),如果有的話。引數型別可以是基本型別、複合型別或域型別,或者可以引用表列的型別。

根據實現語言,可能還允許指定偽型別,如cstring。偽型別表示實際引數型別要麼不完整指定,要麼超出了普通 SQL 資料型別的集合。

透過編寫table_name.column_name%TYPE來引用列的型別。使用此功能有時有助於使過程獨立於表定義的更改。

default_expr

如果未指定引數,則用作預設值的表示式。該表示式必須可以強制轉換為引數的引數型別。具有預設值的引數之後的所有輸入引數也必須具有預設值。

lang_name

過程實現所在的語言名稱。它可以是sqlcinternal,或者使用者定義的程式語言的名稱,例如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過程不能執行事務控制語句(例如,根據語言,COMMITROLLBACK)。

configuration_parameter
value

SET 子句會導致在進入過程時將指定的配置引數設定為指定的值,然後在過程退出時恢復到其先前的值。SET FROM CURRENT 儲存執行CREATE PROCEDURE時當前的值作為進入過程時要應用的值。

如果SET 子句附加到過程,則在該過程內執行的SET LOCAL 命令對同一變數的影響僅限於該過程:在過程退出時仍會恢復配置引數的先前值。但是,普通的SET 命令(不帶LOCAL)會覆蓋SET 子句,正如它會覆蓋之前的SET LOCAL 命令一樣:此類命令的效果在過程退出後仍然存在,除非當前事務被回滾。

如果SET 子句附加到過程,那麼該過程不能執行事務控制語句(例如,根據語言,COMMITROLLBACK)。

有關允許的引數名稱和值的更多資訊,請參閱 SET第 19 章

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 ATOMIC
  statement;
  statement;
  ...
  statement;
END

這與將過程主體文字寫為字串常量(參見上面的definition)類似,但有一些區別:這種形式僅適用於LANGUAGE SQL,而字串常量形式適用於所有語言。這種形式在過程定義時解析,字串常量形式在執行時解析;因此,這種形式不支援多型引數型別和其他在過程定義時無法解析的構造。這種形式跟蹤過程與過程主體中使用的物件之間的依賴關係,因此DROP ... CASCADE 將正常工作,而使用字串字面量的形式可能會留下懸空的過程。最後,這種形式與 SQL 標準和其他 SQL 實現的相容性更好。

註釋

有關適用於過程的函式建立的更多詳細資訊,請參閱CREATE FUNCTION

使用CALL 來執行過程。

示例

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

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。