DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第2部分
2010-02-16 14:59:32 来源:WEB开发网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 不是在复合语句外声明的。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接