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

根据实现语言的不同,还可能允许指定“伪类型”,例如cstring。伪类型表示实际参数类型未完全指定,或者位于普通 SQL 数据类型集之外。

通过写入table_name.column_name%TYPE来引用列的类型。使用此功能有时可以使过程独立于表定义的更改。

关键字EXTERNAL允许与 SQL 保持一致,但它是可选的,因为与 SQL 不同,此功能不仅适用于外部过程,而且还适用于所有过程。

SECURITY DEFINER过程无法执行事务控制语句(例如COMMITROLLBACK,具体取决于语言)。

如果将SET子句附加到过程,则在该过程内针对同一变量执行的SET LOCAL命令的作用仅限于该过程:配置参数的先前值仍在过程退出时恢复。但是,普通的SET命令(不带LOCAL)会覆盖SET子句,就像对上一个SET LOCAL命令所做的一样:除非过程回滚,否则该命令的效果将在过程退出后 continue 存在。

如果将SET子句附加到过程,则该过程无法执行事务控制语句(例如COMMITROLLBACK,具体取决于语言)。

有关允许的参数名称和值的更多信息,请参见SETChapter 19

使用美元引号(请参见Section 4.1.2.4)来编写过程定义字符串,而不是普通的单引号语法,通常会很有帮助。如果不使用美元引号,则必须通过将它们加倍来对过程定义中的任何单引号或反斜杠进行转义。

当重复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

See Also

ALTER PROCEDURE, DROP PROCEDURE, CALL, CREATE FUNCTION

上一章 首页 下一章