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

描述

CREATE PROCEDURE 定义一个新过程。CREATE OR REPLACE PROCEDURE 则会创建新过程或替换现有定义。定义过程时,用户必须对该语言拥有 USAGE 权限。

若包含模式名称,则过程将在指定模式中创建;否则创建于当前模式。新过程名称不得与同一模式下任何具有相同输入参数类型的现有过程重名。但参数类型不同的过程和函数可共享名称(重载)。

要更新现有存储过程的当前定义,请使用 CREATE OR REPLACE PROCEDURE 语句。此方法无法更改存储过程的名称或参数类型(这样做实际上会创建一个新的、独立的存储过程)。

当使用 CREATE OR REPLACE PROCEDURE 替换现有存储过程时,该存储过程的所有权和权限保持不变。所有其他存储过程属性将被赋予命令中指定或隐含的值。您必须拥有该存储过程才能进行替换(这包括作为拥有角色的成员)。

创建存储过程的用户将成为该存储过程的所有者。

要创建过程,必须对参数类型拥有USAGE权限。

参数

  • name

    • 要创建的存储过程的名称(可选带模式限定)。
  • argmode

    • 参数模式:IN、INOUT 或 VARIADIC。若省略,默认为 IN。(目前不支持过程中的 OUT 参数,请改用 INOUT。)
  • argname

    • 参数的名称。
  • argtype

    • T过程参数的数据类型(可选带模式限定),如有。参数类型可以是基类型、复合类型或域类型,也可以引用表列的类型。

    • 根据具体实现语言,也可能允许指定伪类型(如cstring)。伪类型表明实际参数类型要么未完整指定,要么超出常规SQL数据类型的范围。

    • 列的类型通过表名.列名%类型来引用。使用此功能有时可使过程不受表定义变更的影响。

  • default_expr

    • 当参数未指定时使用的默认值表达式。该表达式必须可强制转换为参数的参数类型。在参数列表中,每个位于带默认值参数之后的输入参数也必须具有默认值。
  • lang_name

    • 存储过程实现所使用的语言名称。可以是 SQL、C、内部语言,或用户自定义过程语言的名称(例如 plpgsql)。使用单引号包裹名称的做法已弃用,且要求大小写匹配。
  • TRANSFORM { FOR TYPE type_name } [, ... ] }

    • 应列出用于转换过程调用的转换器。转换器在SQL类型与语言特定数据类型之间进行转换。过程化语言实现通常内置了对内置类型的硬编码支持,因此无需在此列出。若过程化语言实现无法处理某种类且未提供转换器,则会回退到默认的数据类型转换行为,但具体实现方式因实现而异。
  • [EXTERNAL] SECURITY INVOKER

  • [EXTERNAL] SECURITY DEFINER

    • SECURITY INVOKER(默认值)表示该过程将以调用者的权限运行。
    • SECURITY DEFINER 指定该过程将以创建者的权限运行。
    • 关键字 EXTERNAL 允许用于符合 SQL 标准,但该选项可选——与 SQL 不同,此特性适用于所有过程而非仅限外部过程。
    • 安全定义程序不能执行事务控制语句(例如,根据语言的不同,包括COMMIT和ROLLBACK)。
  • configuration_parameter

  • value

    • SET子句在进入存储过程时将值赋予会话配置参数。当存储过程退出时,该配置参数将恢复为先前值。SET FROM CURRENT会将执行CREATE PROCEDURE语句时参数的当前值保存为进入存储过程时应用的值。
    • 若SET子句附加于过程,则在该过程内部对同一变量执行的SET LOCAL命令效果仅限于该过程:配置参数的先前值仍会在过程退出时恢复。然而,普通SET命令(不带LOCAL修饰符)会覆盖SET子句,其效果类似于覆盖先前SET LOCAL命令:除非当前事务被回滚,否则此类命令的效果将在过程退出后持续生效。
    • 如果一个过程附带了SET子句,则该过程不能执行事务控制语句(例如COMMIT和ROLLBACK,具体取决于语言)。
    • 有关允许的参数名称和值的更多信息,请参阅 SET。
  • definition

    • 定义过程的字符串常量;其含义取决于语言。它可以是内部过程名称、对象文件的路径、SQL命令,或过程化语言中的文本。
  • obj_file, link_symbol

    • 此形式的AS子句用于动态加载的C语言过程,当C语言源代码中的过程名称与SQL过程名称不一致时使用。字符串 obj_file 是包含动态加载对象的文件名,其解释方式与 LOAD 命令相同。字符串 link_symbol 是 C 语言源代码中存储过程的名称。若省略链接符号,则默认与正在定义的 SQL 存储过程名称相同。
    • 当多次调用CREATE PROCEDURE语句时,若其指向同一对象文件,该文件在每个会话中仅加载一次。若需卸载并重新加载该文件(例如在开发过程中),请启动新会话。

注意

有关函数创建的更多详细信息(同样适用于存储过程),请参阅CREATE FUNCTION

使用 CALL 执行存储过程。

示例

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标准中定义了CREATE PROCEDURE命令。数据库版本与此类似但并非完全兼容。详情请参阅CREATE FUNCTION

另见

ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, CALL