CREATE PROCEDURE(存储)

创建存储过程

语法

CREATE [ OR REPLACE ] PROCEDURE [ IF NOT EXISTS ]
    [[database.]schema.]procedure( [ parameter-list ] )
    [ LANGUAGE 'language-name' ]
    [ SECURITY { DEFINER | INVOKER } ]
    AS $$ source $$;

参数

OR REPLACE
如果已存在相同名称的过程,请将其替换。对原始过程具有权限的用户和角色在新过程中保留这些权限。

此选项无法与 IF NOT EXISTS 结合使用。

IF NOT EXISTS

如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。

IF NOT EXISTS 子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。

请参阅 ON_ERROR_STOP 了解相关信息。

此选项无法与 OR REPLACE 结合使用。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

过程
存储过程的名称,其中 procedure-name符合标识符中描述的约定。
parameter-list
正式参数的逗号分隔列表,每个参数指定如下:
[ parameter-mode ] parameter-name parameter-type
  • parameter-name:参数的名称。

  • parameter-type:任何 SQL 数据类型,以下内容除外:

    • DECIMAL

    • NUMERIC

    • NUMBER

    • MONEY

    • UUID

    • GEOGRAPHY

    • GEOMETRY

    • 复杂类型

language-name
指定过程 source 的语言,为以下之一(两个选项均涉及 PLvSQL;PLpgSQL 包括在内以保持与现有脚本的兼容性):
  • PLvSQL

  • PLpgSQL

默认值: PLvSQL

SECURITY { DEFINER | INVOKER }
确定在调用过程时要使用的权限并执行它,就好像用户为以下之一:
  • DEFINER:定义过程的用户

  • INVOKER:调用过程的用户

使用 SECURITY DEFINER 的过程以该用户身份有效地执行过程,因此,对数据库的更改似乎是由过程的定义者(而不是其调用者)执行的。

有关详细信息,请参阅执行存储过程

过程源代码。有关详细信息,请参阅范围和结构

特权

非超级用户:对过程架构的 CREATE 权限

示例

有关更复杂的示例,请参阅 存储过程:用例和示例

此过程打印其实参:

=> CREATE PROCEDURE raiseXY(IN x INT, y VARCHAR) LANGUAGE PLvSQL AS $$
BEGIN
    RAISE NOTICE 'x = %', x;
    RAISE NOTICE 'y = %', y;
    -- some processing statements
END;
$$;

CALL raiseXY(3, 'some string');
NOTICE 2005:  x = 3
NOTICE 2005:  y = some string

有关 RAISE NOTICE 的详细信息,请参阅错误和诊断

另请参阅