您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

匿名版块

匿名块是可执行的 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。

有关 的详细信息,请参阅 CALL。

以下示例说明了如何使用 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