CREATE PROCEDURE
使用此 SQL 语句创建过程。
语法
CREATE [OR REPLACE] PROCEDURE [()] [LANGUAGE ] [SQL SECURITY ] [DEFAULT SCHEMA ]
[READS SQL DATA ] [] [ DETERMINISTIC ] [WITH ENCRYPTION] [AUTOCOMMIT DDL { ON|OFF } ]
AS
{ BEGIN [ SEQUENTIAL EXECUTION | PARALLEL EXECUTION ]
END | HEADER ONLY }
📋 ✓
语法元素
以下语法元素可用:
具有可选模式名称的过程的标识符 ::= [.]
过程的输入和输出参数 ::= [{, }...]
具有关联数据类型的过程参数 ::= IN | OUT | INOUT备注缺省值为 IN。使用关键字 IN/OUT/INOUT 标记每个参数。必须为输入和输出参数显式分配一个类型(这意味着支持不含类型的表)
过程的输入和输出参数可以具有任何原始 SQL 类型或表类型。INOUT 参数只能是标量或数组类型。 数组变量或常量数组可以作为输入、输出和 inout 参数传递到过程,但具有以下限制: 不支持 LOB 类型数组参数。不支持数组参数的 DEFAULT VALUE。不支持在动态 SQL 的 USING 子句中使用数组参数。 ::= [ARRAY] | | |
不支持在动态 SQL 的 USING 子句中使用数组参数。
变量的数据类型 ::= DATE | TIME | TIMESTAMP | SECONDDATE | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | | VARCHAR | NVARCHAR | ALPHANUM | VARBINARY | CLOB | NCLOB | BLOB | ST_GEOMETRY备注有关数据类型的详细信息,请参阅 SAP Help Portal 上 SAP HANA SQL 参考指南中的数据类型。
之前使用 CREATE TYPE 命令定义的表类型,请参阅 CREATE TYPE。 ::=
在签名中隐式定义的表类型 ::= TABLE () ::= [{, }...] ::= ::=
过程中编程语言的定义。缺省值为 SQLSCRIPT。LANGUAGE ::= SQLSCRIPT | R提示最好在所有过程定义中定义语言。
指定过程的安全模式。缺省值为 DEFINER。SQL SECURITY ::= DEFINER | INVOKER
指示过程的执行使用过程定义者的权限执行。DEFINER
指示过程的执行使用过程调用者的特权执行。INVOKER
指定过程主体中非限定对象的模式;如果未指定任何内容,则使用会话的 current_schema(定义过程时)。DEFAULT SCHEMA ::=
将过程标记为只读且无副作用 - 该过程不会对数据库数据或其结构进行修改。这意味着该过程不包含 DDL 或 DML 语句,并且仅调用其它只读过程。使用此参数的优势在于某些优化可用于只读过程。READS SQL DATA
有关 的更多信息,请参阅 SQLScript 变量缓存。
缺省情况下,每个 SQLScript 过程或函数都在 AUTOCOMMIT 模式 OFF 和 AUTOCOMMIT DDL 模式 OFF 下运行。在某些情况下,可能需要 AUTOCOMMIT DDL 模式 ON,例如无法在 DDL AUTOCOMMIT 模式关闭下运行的管理操作(例如 IMPORT)。现在,您可以显式指定过程应在 AUTOCOMMIT DDL 模式为 ON 还是 OFF 的情况下运行。属性的缺省值仍为 'OFF'。AUTOCOMMIT DDL ON|OFF通过使用系统视图 'PROCEDURES' 中的列 'AUTO_COMMIT_DDL',可以找出每个过程的 AUTOCOMMIT DDL 模式。以下限制适用:它不能用于函数中不能用于非 SQLScript 过程它不能用于只读过程。
根据所选编程语言,定义过程的主体 ::= [] [] []
此语句强制按顺序执行过程逻辑。不会发生并行化。SEQUENTIAL EXECUTION
过程变量、游标和条件声明 ::= [{, }…] ::= DECLARE {|||} ; ::= {|}::= [CONSTANT] {|}[NOT NULL][]::= [{, ::= ([{,}...])::= ARRAY [ = ] ::= ARRAY ( [ { , }...] ) ::= (DEFAULT | '=' ) |::= An element of the type specified by or an expression ::= CURSOR [ ( proc_cursor_param_list ) ] FOR ; ::= [{, }...] ::= ::= ::= ::= CONDITION | CONDITION FOR
声明异常处理程序以捕获 SQL 异常。 ::= [, [,…] ] ::= DECLARE { EXIT | CONTINUE } HANDLER FOR ;
为条件变量声明的错误代码编号或条件名称。 ::= SQLEXCEPTION | |
过程主体语句。 ::= {}... ::= | | | | | | | | | | | | | | | | | | | | | |
将特定位置的新数据记录插入到表变量中。 ::= :.INSERT((,…, ), <index>)有关插入、更新和删除数据记录的更多信息,请参见修改表变量的内容。
您可以在特定位置修改数据记录。有两个等效的语法选项: ::= :.UPDATE((,…, ), <index>) ::= [<index>] = (,…, )
您可以从表变量中删除数据记录。可使用以下语法删除单个记录。 ::= :.DELETE(<index>)
要从表变量中删除记录块,可以使用以下语法: ::= :.DELETE(..)
过程部分可以使用 BEGIN 和 END 终端嵌套 ::= BEGIN [] [] END ; ::= [SEQUENTIAL EXECUTION ]| [AUTONOMOUS TRANSACTION] | [PARALLEL EXECUTION]
将值分配给变量 - <表达式> 可以是简单表达式(如字符、日期或数字),也可以是标量函数或标量用户定义的函数。 ::= = { | } ; | '[' ']' = ;
ARRAY_AGG 函数通过聚合表变量的指定列中的元素集来返回数组。可以选择对元素进行排序。CARDINALITY 函数返回数组中的元素数 。TRIM_ARRAY 函数通过从数组末尾删除给定数量的元素 来返回新数组。ARRAY 函数返回其元素在 列表中指定的数组。有关详细信息,请参阅数组变量章节。 = ARRAY_AGG ( :. [ ORDER BY ] ) | CARDINALITY ( :) | TRIM_ARRAY ( : , ) | ARRAY ( ) ::= ::= ::=
仅具有一个函数求值的值到变量列表的分配。例如, 必须是标量用户定义的函数,并且 中的元素数量必须等于标量用户定义函数的输出参数数。 ::= () = ::= = | = | = | = | =
MAP_MERGE 运算符用于将输入表的每一行应用于映射器函数,并统一所有中间结果表。有关详细信息,请参阅映射合并运算符。 ::= MAP_MERGE(, (. [ {, .} … ] [, ]) ::= | ::= ::= ::= ::= [{, } …] = | | |
有关 CE 运算符的详细信息,请参阅计算引擎计划运算符。 ::= TRACE ( ) ; | CE_LEFT_OUTER_JOIN ( , , '[' ']' [ ] ) ; | CE_RIGHT_OUTER_JOIN ( , , '[' ']' [ ] ) ; | CE_FULL_OUTER_JOIN ( , , '[' ']' [ ] ); | CE_JOIN ( , , '[' ']' [] ) ; | CE_UNION_ALL ( , ) ; | CE_COLUMN_TABLE ( [ ] ) ; | CE_JOIN_VIEW ( [ ] ) ; | CE_CALC_VIEW ( [ ] ) ; | CE_OLAP_VIEW ( [ ] ) ; | CE_PROJECTION ( , '[' ']' ) ; | CE_PROJECTION ( ) ; | CE_AGGREGATION ( , '[' ']' [ ] ); | CE_CONVERSION ( , '[' ']' [ ] ) ; | CE_VERTICAL_UNION ( , '[' ']' ) ; ::= [.]
APPLY_FILTER 定义在运行时期间应用的动态 WHERE 条件 。有关详细信息,请参阅章节 APPLY_FILTER。 ::= APPLY_FILTER ( { | :}, ) ;
UNNEST 函数为指定数组的每个元素返回一个包含行的表。 ::= UNNEST ( ) [ WITH ORDINALITY ] [] ; ::= : [{, :}...]
将序数列附加到返回值。WITH ORDINALTIY
指定返回表的列名称。 ::= AS [table_name] ( ) ::= [{, }...] ::=
使用 IF - THEN - ELSE IF 控制具有条件的执行流。 ::= IF THEN [SEQUENTIAL EXECUTION][] [] [] [] END IF ; ::= ELSEIF THEN [SEQUENTIAL EXECUTION][] [] ::= ELSE [SEQUENTIAL EXECUTION][] []
使用 循环重复执行一组语句。 ::= LOOP [SEQUENTIAL EXECUTION][] [] END LOOP ;
当条件为真时,使用 WHILE 重复调用一组触发器语句。 ::= WHILE DO [SEQUENTIAL EXECUTION][] [] END WHILE ;
使用 FOR - IN 循环迭代一组数据。 ::= FOR IN [ REVERSE ] .. DO [SEQUENTIAL EXECUTION][] [] END FOR ;
使用 FOR - EACH 循环迭代一组数据中的所有元素。 ::= FOR AS [] DO [SEQUENTIAL EXECUTION][] [] END FOR ; ::= ( [ { , }...] )
跳过当前循环迭代并继续下一个值。 ::= CONTINUE ;
使用 SIGNAL 语句从触发器过程中显式引发异常。 ::= SIGNAL [] ;
使用 RESIGNAL 语句在异常处理程序中引发操作语句异常。如果未指定错误代码,RESIGNAL 将抛出捕获到的异常。 ::= RESIGNAL [] [] ;
您可以 SIGNAL 或 RESIGNAL 信号名称或 SQL 错误代码。 ::= | ::= ::=
过程执行期间抛出指定错误时,可使用 SET MESSAGE_TEXT 向用户传递错误消息。 ::= SET MESSAGE_TEXT = '' ::=
::= | | | | | | | | | 有关 的信息,请参阅 SAP HANA SQL 和系统视图参考中的 INSERT。有关 的信息,请参阅 SAP HANA SQL 和系统视图参考中的 DELETE。有关 的信息,请参阅 SAP HANA SQL 和系统视图参考中的 UPDATE。有关 和 的信息,请参阅 SAP HANA SQL 和系统视图参考中的 REPLACE 和 UPSERT。有关 的信息,请参阅 SAP HANA SQL 和系统视图参考中的 TRUNCATE。
::= SELECT INTO [DEFAULT ] [] [] [] [{ , ... }] [] [] ;
是一个标量变量。您可以将所选项目值分配给此标量变量。 ::= [{, }...] ::=
游标操作 ::= OPEN [ ] ; ::= FETCH INTO ; ::= CLOSE ;
过程调用。有关详细信息,请参阅 CALL:内部过程调用 ::= CALL () ;
使用 EXEC 进行动态 SQL 调用 ::= {EXEC | EXECUTE IMMEDIATE} ;
从过程返回值 ::= RETURN [] ;
描述
CREATE PROCEDURE 语句使用指定的编程语言 创建过程。
示例
示例:创建过程
使用以下定义创建 SQLScript 过程:
CREATE PROCEDURE orchestrationProc
LANGUAGE SQLSCRIPT AS
BEGIN
DECLARE v_id BIGINT;
DECLARE v_name VARCHAR(30);
DECLARE v_pmnt BIGINT;
DECLARE v_msg VARCHAR(200);
DECLARE CURSOR c_cursor1 (p_payment BIGINT) FOR
SELECT id, name, payment FROM control_tab
WHERE payment > :p_payment ORDER BY id ASC;
CALL init_proc();
OPEN c_cursor1(250000);
FETCH c_cursor1 INTO v_id, v_name, v_pmnt; v_msg = :v_name || ' (id ' || :v_id || ') earns ' || :v_pmnt || ' $.';
CALL ins_msg_proc(:v_msg);
CLOSE c_cursor1;
END;
📋 ✓
该过程具有许多命令结构,包括使用游标(具有关联状态)和带赋值的局部标量变量。