PostgreSQL CREATE PROCEDURE

2021-09-09 11:42 更新

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

簡(jiǎn)介

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)。

參數(shù)

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ě)上table_name .column_name%TYPE可以引用某個(gè)列的類型。使用這種特性有時(shí)可以讓過(guò)程不受表定義改變的影響。

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ǔ)言名稱。它可以是sqlc、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ǔ)句(例如COMMITROLLBACK,具體取決于實(shí)現(xiàn)的語(yǔ)言)。

configuration_parameter
value

SET子句導(dǎo)致在進(jìn)入該過(guò)程時(shí)指定的配置參數(shù)被設(shè)置為指定的值,并且在過(guò)程退出時(shí)恢復(fù)到之前的值。SET FROM CURRENTCREATE 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ǔ)句(例如COMMITROLLBACK,具體取決于實(shí)現(xiàn)的語(yǔ)言)。

有關(guān)允許的參數(shù)名和值的更多信息請(qǐng)參考SET第 19 章。

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ì)話。

注解

函數(shù)創(chuàng)建也適用于過(guò)程,更多細(xì)節(jié)請(qǐng)參考CREATE FUNCTION。

使用CALL來(lái)執(zhí)行過(guò)程。

示例

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)