支援的版本:目前 (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 權限。

如果包含 schema 名稱,則會在指定的 schema 中建立程序。 否則,它會在目前的 schema 中建立。 新程序的名稱不能與同一個 schema 中,具有相同輸入引數類型的現有程序或函式相符。 但是,不同引數類型的程序和函式可以共用一個名稱(這稱為重載)。

若要取代現有程序的目前定義,請使用 CREATE OR REPLACE PROCEDURE。 無法以這種方式變更程序的名稱或引數類型(如果您嘗試這樣做,實際上會建立一個新的、不同的程序)。

當使用 CREATE OR REPLACE PROCEDURE 來取代現有程序時,程序的擁有權和權限不會變更。 所有其他程序屬性都會被指定為指令中指定或暗示的值。 您必須擁有該程序才能取代它(包括成為擁有角色的成員)。

建立程序的使用者會成為該程序的擁有者。

若要能夠建立程序,您必須擁有引數類型的 USAGE 權限。

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

參數

name

要建立的程序名稱(選擇性地帶有 schema 限定詞)。

argmode

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

argname

引數的名稱。

argtype

程序的引數資料類型(選擇性地帶有 schema 限定詞),如果有的話。 引數類型可以是基本類型、複合類型或網域類型,也可以參照資料表欄位的類型。

根據實作語言,也可能允許指定 虛擬類型,例如 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

當 C 語言原始碼中的程序名稱與 SQL 程序名稱不同時,AS 子句的此形式會用於動態載入的 C 語言程序。 字串 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);

相容性

CREATE PROCEDURE 命令已在 SQL 標準中定義。 PostgreSQL 實作可以相容的方式使用,但有許多擴充功能。 如需詳細資訊,另請參閱 CREATE FUNCTION

提交更正

如果您在文件中發現任何不正確、與特定功能的體驗不符或需要進一步釐清的地方,請使用此表格回報文件問題。