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

DO BEGIN...END 语句(过程)

一次执行匿名块。

语法

DO 

[ ] [ ( ) ]

BEGIN [ ]

END

语法元素

指定命名参数的列表。 ::= ( [ ] [ { , } … ] )指定参数的名称。 ::= , , 指定具有值绑定的过程的输入和输出参数。 ::= [, … ]指定过程参数及其关联的数据类型和值绑定。 ::= => 指定过程参数。指定要应用于块的一个或多个属性。 ::= SEQUENTIAL EXECUTION | PARALLEL EXECUTION | AUTONOMOUS TRANSACTION 顺序执行指定 SEQUENTIAL EXECUTION 以排序独立 DML 语句和读写过程调用的执行。 并行执行指定 PARALLEL EXECUTION 以并行执行独立的 DML 语句和读写过程调用。 AUTONOMOUS TRANSACTION如果希望独立于主过程执行块,请指定 AUTONOMOUS TRANSACTION。无论主过程事务是提交还是回滚,都会保留使用 AUTONOMOUS TRANSACTION 进行和提交的更改。AUTONOMOUS TRANSACTION 块的结束具有隐式提交。声明用于匿名块的变量。 ::= [ ] […] ::= DECLARE { | TABLE ( [,…] [ SEARCH KEY ( [,…] ) ; | DECLARE AUTO ; ::= ::= { ( DEFAULT | := | = ) { | }指定 AUTO 允许声明变量及其缺省值,而无需显式设置数据类型。指定一个或多个作为匿名块的一部分执行的语句。

描述

匿名块仅执行一次。在匿名块中还支持过程中支持的所有 SQLScript 语句。与过程不同,匿名块未在目录中创建相应的对象。

匿名块在单个步骤中定义和执行。因此,不需要执行 CREATEDROP 等生命周期处理。匿名块的正文与过程主体类似。

要返回结果集,请使用 SELECT 语句,因为匿名块未定义任何参数。

对于输出参数,?是有效值,不能省略,否则无法绑定查询参数。对于输入参数,可以设置物理表的名称。对于标量输入参数,可以使用任何标量表达式,标量 UDF 除外。不支持 DEFAULT EMPTY 和 INOUT 参数。

示例

执行一个匿名块,创建一个表并将值插入到该表中。

DO

BEGIN

DECLARE I INTEGER;

CREATE ROW TABLE TAB1 (I INTEGER);

FOR I IN 1..10 DO

INSERT INTO TAB1 VALUES (:I);

END FOR;

END;

执行匿名块并使用 SELECT 语句返回结果集。

DO

BEGIN

T1 = SELECT I, 10 AS J FROM TAB;

T2 = SELECT I, 20 AS K FROM TAB;

T3 = SELECT J, K FROM :T1, :T2 WHERE :T1.I = :T2.I;

SELECT * FROM :T3;

END;

执行调用其他过程的匿名块。

DO

BEGIN

T1 = SELECT * FROM TAB;

CALL PROC3(:T1, :T2);

SELECT * FROM :T2;

END;

执行包含异常处理器的匿名块。

DO

BEGIN

DECLARE I, J INTEGER;

BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION

IF ::SQL_ERROR_CODE = 288 THEN

DROP TABLE TAB;

CREATE ROW TABLE TAB (I INTEGER PRIMARY KEY);

ELSE

RESIGNAL;

END IF;

CREATE ROW 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;

执行使用 COMMITROLLBACK 的匿名块。

DO

BEGIN

CREATE ROW TABLE TAB2 (K INT);

COMMIT;

DROP TABLE TAB;

CREATE ROW TABLE TAB (J INT);

ROLLBACK;

DELETE FROM TAB;

END;

执行调用过程以处理所选数据的匿名块。

DO

BEGIN

T1 = SELECT I, 10 AS J FROM TAB;

T2 = SELECT I, 20 AS K FROM TAB;

T3 = SELECT J, K FROM :T1, :T2 WHERE :T1.I = :T2.I;

CALL PROC3(:T3, T4);

SELECT * FROM :T4;

END;

执行运行循环的匿名块以将数据插入到表中。

DO

BEGIN

DECLARE I INTEGER;

FOR I in 1..3 DO

INSERT INTO TAB VALUES (:I);

END FOR;

END;

执行计算两个整数总和的匿名块。

DO (IN A INT => 1, IN B INT => ?, OUT C INT => ?)

BEGIN

C = :A + :B;

END;