WEB开发网
开发学院数据库DB2 DB2 9.5 SQL Procedure Developer 认证考试 735 准... 阅读

DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第2部分

 2010-02-16 14:59:32 来源:WEB开发网   
核心提示:ATOMIC 和NOT ATOMIC 复合 SQL语句有两种类型的复合语句:NOT ATOMIC(默认)和ATOMIC,NOT ATOMIC如果发生一个未处理的错误条件,DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第2部分(4),不会回滚 SQL语句,清单 3 演示了这种语句

ATOMIC 和NOT ATOMIC 复合 SQL语句

有两种类型的复合语句:NOT ATOMIC(默认)和ATOMIC。

NOT ATOMIC

如果发生一个未处理的错误条件,不会回滚 SQL语句。清单 3 演示了这种语句。

清单 3. NOT ATOMIC 复合语句

CREATE TABLE t1 (c1 INT, c2 CHAR(5))!
CREATE PROCEDURE my_proc1 ()
SPECIFIC not_atomic_example
P1: BEGIN NOT ATOMIC
  INSERT INTO t1 VALUES(1, 'FIRST');  --(1)
  -- SIGNAL SQLSTATE TO INFORCE ERROR
  SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'INFORCE ERROR';
  INSERT INTO t1 VALUES (2,'SECND');  --(2)
END P1!

如果 INSERT (1) 被成功地执行,那么就会发生一个错误,这个SQL过程还没有执行 INSERT (2) 就被终止。由于这个SQL过程是用NOT ATOMIC语句创建的,第一条 INSERT语句不会被回滚。如果在该存储过程执行之后查询表 T1,则会返回:

C1 C2
1 FIRST

ATOMIC

在一条 ATOMIC 复合语句的执行期间,如果其中发生任何未处理的错误条件,那么在此之前已执行的所有语句都被回滚。ATOMIC语句不能被嵌套在其他 ATOMIC 复合语句中。

清单 4 显示了包含 ATOMIC 复合语句的过程:

清单 4. 包含 ATOMIC 复合语句的过程

CREATE PROCEDURE my_proc2 ()
SPECIFIC atomic_example
P1: BEGIN ATOMIC
  INSERT INTO t1 VALUES(3, 'THIRD');  --(1)
  -- SIGNAL SQLSTATE TO INFORCE ERROR
  SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'INFORCE ERROR';
  INSERT INTO t1 VALUES (4,'FOUR');   --(2)
END P1

如果 INSERT (1) 已成功执行,然后发生一个错误,则 SQL过程还没有执行 INSERT (2) 即被终止。由于这个存储过程创建时使用了 ATOMIC语句,因此第一条 INSERT 被回滚。如果在该 SQL过程执行后查询表 T1,结果只会返回前一个例子插入的一行:

C1 C2
1 FIRST

复合 SQL语句与变量的作用域

在SQL过程中可以有一个或多个复合语句。那些复合语句可以是嵌套的,也可以是一个接一个的。每个复合语句引入一个新的本地变量的作用域,那些变量只能在此作用域中使用。正是由于这个原因,当一个存储过程中有不止一个复合语句时,我们建议使用标签。

看看清单 5中的例子:

清单 5. 嵌套的复合块

CREATE PROCEDURE VAR_SCOPE ( )
L1:BEGIN
  DECLARE v_outer1 INT;
  DECLARE v_outer2 INT;
  L2:BEGIN
    DECLARE v_inner1 INT;
    DECLARE v_inner2 INT;
    SET v_outer1 = 100;  --(1) -- success
    SET v_inner1 = 200;
  END L2;
  SET v_outer2 = 300;
  SET v_inner2 = 400;  --(2) -- fail
END L1

构建这个SQL过程时,会收到以下错误消息:DB2ADMIN.VAR_SCOPE: 12: "V_INNER2" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.50.152

注意,语句 (1) 成功地通过,因为v_outer1是在复合语句外声明的,但是语句 (2) 失败了,因为v_inner2 不是在复合语句外声明的。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:DB SQL Procedure

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接