# 创建过程

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

# 描述

创建过程定义了一个新的过程。创建或替换过程将创建一个新过程,或替换现有定义。为了能够定义一个过程,用户必须拥有用法语言的特权。

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

要替换现有过程的当前定义,请使用创建或替换过程.无法以这种方式更改过程的名称或参数类型(如果您尝试过,您实际上会创建一个新的、不同的过程)。

什么时候创建或替换过程用于替换现有程序,程序的所有权和权限不会改变。所有其他过程属性都分配了命令中指定或暗示的值。您必须拥有替换它的过程(这包括成为拥有角色的成员)。

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

为了能够创建一个过程,你必须有用法参数类型的特权。

参考第 38.4 节有关写作程序的更多信息。

# 参数

姓名

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

参数模式

参数的模式:,出去,进出, 或者杂音.如果省略,则默认为.

参数名称

参数的名称。

参数类型

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

根据实现语言,它也可能被允许指定“伪类型”,例如字符串.伪类型表示实际参数类型要么未完全指定,要么超出普通 SQL 数据类型集。

列的类型通过写来引用*表名*.*列名*%类型.使用此功能有时可以帮助使过程独立于对表定义的更改。

default_expr

如果未指定参数,则用作默认值的表达式。表达式必须强制转换为参数的参数类型。具有默认值的参数之后的所有输入参数也必须具有默认值。

语言名

程序实施的语言名称。它可以是sql,C,内部的,或用户定义的过程语言的名称,例如,plpgsql.默认是sql如果sql_body*被指定。*不推荐用单引号将名称括起来,并且需要匹配大小写。转换 { 类型 *

类型名称* } [, ... ] }应该应用转换对过程的调用的列表。

转换在 SQL 类型和特定语言的数据类型之间进行转换;看创建转换.过程语言实现通常具有内置类型的硬编码知识,因此不需要在此处列出。如果过程语言实现不知道如何处理类型并且没有提供转换,它将回退到转换数据类型的默认行为,但这取决于实现。[外部] 安全调用程序

[外部] 安全定义器
安全调用者

表示该过程将以调用它的用户的权限执行。这是默认设置。安全定义器指定该过程将以拥有它的用户的权限执行。

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

一种安全定义器过程不能执行事务控制语句(例如,犯罪回滚,取决于语言)。

配置参数
价值

子句使指定的配置参数在进入过程时设置为指定值,然后在过程退出时恢复为之前的值。从当前设置保存当前参数的值创建过程作为进入过程时应用的值执行。

如果一个子句附加到程序后,则设置本地在过程中对同一变量执行的命令被限制在过程中:配置参数的先前值在过程退出时仍然恢复。然而,一个普通的命令(没有当地的) 覆盖子句,就像它对以前的设置本地命令:这样的命令的效果将在过程退出后持续存在,除非当前事务被回滚。

如果一个子句附加到过程,则该过程不能执行事务控制语句(例如,犯罪回滚,取决于语言)。

第 20 章有关允许的参数名称和值的更多信息。

定义

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

使用美元报价通常很有帮助(请参阅第 4.1.2.4 节) 来编写过程定义字符串,而不是普通的单引号语法。如果没有美元引号,则过程定义中的任何单引号或反斜杠都必须通过加倍来转义。

*obj_file*, *链接符号*

这种形式的作为当 C 语言源代码中的过程名称与 SQL 过程的名称不同时,子句用于可动态加载的 C 语言过程。字符串*obj_file是包含已编译 C 过程的共享库文件的名称,并被解释为加载命令。字符串链接符号*是过程的链接符号,即C语言源代码中过程的名称。如果省略链接符号,则假定它与正在定义的 SQL 过程的名称相同。

重复时创建过程调用引用相同的目标文件,该文件每个会话仅加载一次。要卸载和重新加载文件(可能在开发期间),请启动一个新会话。

sql_body

一个人的身体语言 SQL程序。这应该是一个块

BEGIN ATOMIC
  statement;
  statement;
  ...
  statement;
END

这类似于将过程主体的文本写为字符串常量(参见*定义*以上),但有一些区别:这种形式只适用于语言 SQL,字符串常量形式适用于所有语言。这种形式在过程定义时解析,字符串常量形式在执行时解析;因此这种形式不能支持多态参数类型和其他在过程定义时不可解析的结构。这种形式跟踪过程和过程主体中使用的对象之间的依赖关系,因此下降...级联将正常工作,而使用字符串文字的表单可能会留下悬空过程。最后,这种形式更兼容 SQL 标准和其他 SQL 实现。

# 笔记

创建函数有关也适用于过程的函数创建的更多详细信息。

采用称呼执行一个程序。

# 例子

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

# 兼容性

一种创建过程命令在 SQL 标准中定义。PostgreSQL 实现可以以兼容的方式使用,但有许多扩展。有关详细信息,另请参阅创建函数.

# 也可以看看

改变程序,丢弃程序,称呼,创建函数