Postgresql 中文操作指南

CREATE PROCEDURE

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

Description

CREATE PROCEDURE 定义了一个新过程。 CREATE OR REPLACE PROCEDURE 将创建一个新过程,或替换现有定义。若要能够定义一个过程,用户必须具有 USAGE 在该语言上的权限。

如果包含一个模式名称,则该过程将在指定模式中创建。否则,将在当前模式中创建它。新过程的名称不能与同一模式中具有相同输入参数类型的任何现有过程或函数相匹配。但是,不同参数类型的过程和函数可以共享一个名称(这称为 overloading )。

要替换现有过程的当前定义,请使用 CREATE OR REPLACE PROCEDURE 。不能通过这种方式来更改过程的名称或参数类型(如果您尝试这样做,实际上会创建一个新的、不同的过程)。

当使用 CREATE OR REPLACE PROCEDURE 来替换现有过程时,过程的所有权和权限不会改变。所有其他过程属性都将被分配在命令中指定或隐含的值。您必须拥有要替换过程的所有权(包括是拥有角色的成员)。

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

要能够创建一个过程,您必须在参数类型上拥有 USAGE 权限。

有关编写过程的更多信息,请参阅 Section 38.4

Parameters

  • name

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

  • argmode

    • 参数的模式: INOUTINOUTVARIADIC 。如果省略,则默认值为 IN

  • argname

    • 参数的名称。

  • argtype

    • 如果存在,过程参数的数据类型(可选的限定架构),如果有的话。参数类型可以是基本类型、复合类型或域类型,或者可以引用表列的类型。

    • 根据实现语言,还可能允许指定“伪类型”,如 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 指定过程要使用拥有它的用户的权限来执行。

    • SQL 一致性允许关键字 EXTERNAL ,但它是可选的,因为与 SQL 中不同,此特性应用于所有过程,不仅应用于外部过程。

    • SECURITY DEFINER 过程不能执行事务控制语句(例如, COMMITROLLBACK ,取决于语言)。

  • configuration_parameter__value

    • SET 子句导致指定的配置参数在进入过程时设置为指定的值,然后在退出过程时恢复到它的先前值。 SET FROM CURRENT 将在执行 CREATE PROCEDURE 时当前的参数值保存为在进入过程时要应用的值。

    • 如果 SET 子句附加到一个过程,那么在过程内部为同一变量执行的 SET LOCAL 命令的效果仅限于该过程:该配置参数的先前值仍会在过程退出时恢复。但是,普通的 SET 命令(没有 LOCAL )会覆盖 SET 子句,就像它会覆盖之前的 SET LOCAL 命令一样:这种命令的效果在过程退出后仍然存在,除非回滚当前事务。

    • 如果 SET 子句附加到一个过程,那么该过程不能执行事务控制语句(例如, COMMITROLLBACK ,取决于语言)。

    • 请参阅 SETChapter 20 以获取有关允许的参数名称和值的详细信息。

  • definition

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

    • 通常,使用美元引用(参见 Section 4.1.2.4 )而不是正常的单引号语法来编写过程定义字符串非常有帮助。不使用美元引用,过程定义中的任何单引号或反斜杠都必须通过将其加倍来转义。

  • obj_file_, _link_symbol

    • AS 子句的此形式用于动态可加载 C 语言过程,当 C 语言源代码中的过程名称与 SQL 过程的名称不同时。字符串 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 实现更兼容。

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);
$$;

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

Compatibility

SQL 标准中定义了一个 CREATE PROCEDURE 命令。PostgreSQL 实现可以兼容使用,但有很多扩展。有关详情,另请参阅 CREATE FUNCTION