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 的过程以该用户身份有效地执行过程,因此,对数据库的更改似乎是由过程的定义者(而不是其调用者)执行的。
当心
对 SECURITY DEFINER 使用不当会导致混淆代理问题,并在您的系统中引入 SQL 注入等漏洞。有关详细信息,请参阅执行存储过程。
-
- 源
- 过程源代码。有关详细信息,请参阅范围和结构。
特权
非超级用户:对过程架构的 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 的详细信息,请参阅错误和诊断。