匿名块是可执行的 DML 语句,可以包含命令式语句或声明式语句。
在匿名块中还支持过程中支持的所有 SQLScript 语句。与过程相比,匿名块未在元数据目录中创建相应的对象 - 它们在 SQL 计划缓存中缓存。
使用以下语法在单个步骤中定义和执行匿名块:
DO [()]
BEGIN [SEQUENTIAL EXECUTION]
END WITH HINT (...)
::= !! supports the same feature set as the procedure 有关详细信息,请参阅 SAP Help Portal 上 SAP HANA SQL 和系统视图参考中的 CREATE PROCEDURE 语句。
使用 参数子句,可以定义签名,其中输入和输出参数的值需要使用命名参数进行绑定。
::= [{,}...]
::= (IN|OUT) =>
备注不支持 INOUT 参数和 DEFAULT EMPTY。
有关
以下示例说明了如何使用 parameter 子句调用匿名块:
DO (IN in_var NVARCHAR(24)=> 'A',OUT outtab TABLE (J INT,K INT ) => ?)
BEGIN
T1 = SELECT I, 10 AS J FROM TAB where z = :in_var;
T2 = SELECT I, 20 AS K FROM TAB where z = :in_var;
T3 = SELECT J, K FROM :T1 as a, :T2 as b WHERE a.I = b.I;
outtab = SELECT * FROM :T3;
END
仅用于输出参数?是有效值,不能省略,否则无法绑定查询参数。任何标量表达式都可用于标量输入参数。
如果需要,您还可以参数化标量参数。例如,对于上述示例,如下所示:
DO (IN in_var NVARCHAR(24)=> ?,OUT outtab TABLE (J INT,K INT ) => ?)
BEGIN
T1 = SELECT I, 10 AS J FROM TAB where z = :in_var;
T2 = SELECT I, 20 AS K FROM TAB where z = :in_var;
T3 = SELECT J, K FROM :T1 as a, :T2 as b WHERE a.I = b.I;
outtab = SELECT * FROM :T3;
END
与过程相反,匿名块没有容器特定的属性(例如,语言、安全模式等)。但是,匿名块的正文与过程主体类似。
备注匿名块不能在过程或函数中使用。 现在,可以将 HINT 用于匿名块。但是,匿名块并不支持所有 CALL 支持的提示(例如,路由提示)。 示例代码匿名版块提示DO BEGIN DECLARE i INT; FOR i in 1..5 DO SELECT * FROM dummy; END FOR;END WITH HINT(ignore_plan_cache)
您可以在下面找到匿名块的更多示例:
示例 1
DO
BEGIN
DECLARE I INTEGER;
CREATE TABLE TAB1 (I INTEGER);
FOR I IN 1..10 DO
INSERT INTO TAB1 VALUES (:I);
END FOR;
END;
此示例包含一个匿名块,用于创建一个表并将值插入到该表中。
示例 2
在此示例中,匿名块调用另一个过程。
DO
BEGIN
T1 = SELECT * FROM TAB;
CALL PROC3(:T1, :T2);
SELECT * FROM :T2;
END
示例 3
在此示例中,匿名块使用异常处理程序。
DO (IN J INTEGER => ?)
BEGIN
DECLARE I, J INTEGER;
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
IF ::SQL_ERROR_CODE = 288 THEN
DROP TABLE TAB;
CREATE TABLE TAB (I INTEGER PRIMARY KEY);
ELSE
RESIGNAL;
END IF;
CREATE TABLE TAB (I INTEGER PRIMARY KEY);
END;
FOR I in 1..3 DO
INSERT INTO TAB VALUES (:I);
END FOR;
IF :J <> 3 THEN
SIGNAL SQL_ERROR_CODE 10001;
END IF;
END