On this page
CREATE PROCEDURE
创建过程-定义一个新过程
Synopsis
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'
} ...
Description
CREATE PROCEDURE
定义了一个新过程。 CREATE OR REPLACE PROCEDURE
将创建新过程或替换现有定义。为了能够定义过程,用户必须对语言具有USAGE
特权。
如果包含模式名称,那么将在指定的模式中创建过程。否则,它将在当前架构中创建。新过程的名称不得与任何在相同模式中具有相同 Importing 参数类型的现有过程或函数匹配。但是,不同参数类型的过程和函数可以共享一个名称(这称为* overloading *)。
要替换现有过程的当前定义,请使用CREATE OR REPLACE PROCEDURE
。无法以这种方式更改过程的名称或参数类型(如果尝试过,则实际上是在创建一个新的,不同的过程)。
当使用CREATE OR REPLACE PROCEDURE
替换现有过程时,该过程的所有权和权限不会更改。所有其他过程属性都分配了命令中指定或隐含的值。您必须拥有替换它的过程(包括成为拥有角色的成员)。
创建过程的用户将成为该过程的所有者。
为了能够创建过程,您必须对参数类型具有USAGE
特权。
Parameters
name
- 要创建的过程的名称(可选的模式限定)。
argmode
- 参数的模式:
IN
,INOUT
或VARIADIC
。如果省略,则默认值为IN
。 (过程当前不支持OUT
参数.请改用INOUT
.)
- 参数的模式:
argname
- 参数的名称。
argtype
- 过程参数的数据类型(可选,通过模式限定)(如果有)。参数类型可以是基本,复合或域类型,或者可以引用表列的类型。
根据实现语言的不同,还可能允许指定“伪类型”,例如cstring
。伪类型表示实际参数类型未完全指定,或者位于普通 SQL 数据类型集之外。
通过写入table_name.column_name%TYPE
来引用列的类型。使用此功能有时可以使过程独立于表定义的更改。
default_expr
- 如果未指定参数,则用作默认值的表达式。该表达式必须对参数的参数类型具有强制性。具有默认值的参数之后的所有 Importing 参数也必须具有默认值。
lang_name
- 实现该过程的语言的名称。它可以是
sql
,c
,internal
或用户定义的过程语言的名称,例如plpgsql
。不建议将名称用单引号引起来,并且需要大小写匹配。
- 实现该过程的语言的名称。它可以是
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
子句导致在 Importing 过程时将指定的配置参数设置为指定的值,然后在过程退出时恢复为先前的值。SET FROM CURRENT
将执行CREATE PROCEDURE
时的当前参数值保存为 Importing 该过程时要应用的值。
如果将SET
子句附加到过程,则在该过程内针对同一变量执行的SET LOCAL
命令的作用仅限于该过程:配置参数的先前值仍在过程退出时恢复。但是,普通的SET
命令(不带LOCAL
)会覆盖SET
子句,就像对上一个SET LOCAL
命令所做的一样:除非过程回滚,否则该命令的效果将在过程退出后 continue 存在。
如果将SET
子句附加到过程,则该过程无法执行事务控制语句(例如COMMIT
和ROLLBACK
,具体取决于语言)。
有关允许的参数名称和值的更多信息,请参见SET和Chapter 19。
definition
- 定义过程的字符串常量;含义取决于语言。它可以是内部过程名称,目标文件的路径,SQL 命令或过程语言的文本。
使用美元引号(请参见Section 4.1.2.4)来编写过程定义字符串,而不是普通的单引号语法,通常会很有帮助。如果不使用美元引号,则必须通过将它们加倍来对过程定义中的任何单引号或反斜杠进行转义。
obj_file, link_symbol
- 如果 C 语言源代码中的过程名称与 SQL 过程的名称不同,则
AS
子句的这种形式用于可动态加载的 C 语言过程。字符串*obj_file
是包含编译的 C 过程的共享库文件的名称,并被解释为LOAD命令。字符串link_symbol
*是过程的链接符号,即 C 语言源代码中过程的名称。如果省略链接符号,则假定它与所定义的 SQL 过程的名称相同。
- 如果 C 语言源代码中的过程名称与 SQL 过程的名称不同,则
当重复CREATE PROCEDURE
调用引用同一目标文件时,该文件在每个会话中仅加载一次。要卸载和重新加载文件(可能在开发过程中),请开始一个新的会话。
Notes
有关也适用于过程的函数创建的更多详细信息,请参见CREATE FUNCTION。
使用CALL执行过程。
Examples
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);
Compatibility
在 SQL 标准中定义了CREATE PROCEDURE
命令。 PostgreSQL 版本相似,但不完全兼容。有关详细信息,另请参见CREATE FUNCTION。