你拿着 Oracle 的脚本, 丢到 DB2 里面去跑。 自然是不通过的了。
首先, DB2 是可以支持 BEGIN END 这样的写法的。
例如:
db2 => TRUNCATE TABLE output_debug IMMEDIATE
DB20000I SQL 命令成功完成。
db2 => BEGIN \
db2 (cont.) => DECLARE testvalue INT; \
db2 (cont.) => SET testvalue = 0; \
db2 (cont.) => MyLoop: LOOP \
db2 (cont.) => SET testvalue = testvalue + 1; \
db2 (cont.) => INSERT INTO output_debug VALUES( TO_CHAR(testvalue) ); \
db2 (cont.) => IF testvalue >= 5 THEN \
db2 (cont.) => LEAVE MyLoop; \
db2 (cont.) => END IF; \
db2 (cont.) => END LOOP; \
db2 (cont.) => END
DB20000I SQL 命令成功完成。
db2 => select * from output_debug
DATA
------------------------------------
1
2
3
4
5
5 条记录已选择。
然后,DB2 好像没 DBMS_OUTPUT.put_line 这样的 方法。
DBMS_OUTPUT.put_line 是 Oracle 特有的。
最后,
exception ... when others 这种, 是 Oracle 的异常处理代码。
DB2 的异常处理, 参考下面的例子:
TRUNCATE TABLE output_debug IMMEDIATE@
BEGIN
-- DB2 中,如果需要使用 sqlcode ,那么必须先 DECLARE 以后,才能使用。
DECLARE sqlcode INT;
P1: BEGIN ATOMIC
-- 定义错误处理
-- 如果发生错误,结束处理,并回滚前面做的处理。
DECLARE UNDO HANDLER
FOR
SQLEXCEPTION
BEGIN
-- 异常处理
INSERT INTO output_debug VALUES('出错啦!' || TO_CHAR(sqlcode));
END;
-- 先更新.
UPDATE test_main SET value = 'Test3' WHERE id = 1;
-- 插入一行主键重复数据.
INSERT INTO test_main VALUES(1, 'PK');
INSERT INTO output_debug VALUES('本语句不会执行到!');
END P1;
END
@
db2 => select * from test_main WHERE id = 1@
ID VALUE
----------- ----------
1 Test2
1 条记录已选择。
db2 => select * from output_debug@
DATA
----------------------------------------
出错啦!-803
?号的问题吧!