【发布时间】:2013-11-06 19:11:14
【问题描述】:
我是 Oracle (11gr2) 的新手,我有以下脚本:
BEGIN
DECLARE
source varchar2(1);
BEGIN
dbms_output.enable;
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW SP_AD;';
SELECT SOURCE INTO source FROM map_switch WHERE ROWNUM = 1;
IF source = 'A'
THEN
EXECUTE IMMEDIATE 'DROP TABLE SP_AD_B;';
EXECUTE IMMEDIATE 'RENAME TABLE SP_AD_A TO SP_AD;';
ELSE
EXECUTE IMMEDIATE 'DROP TABLE SP_AD_A;';
EXECUTE IMMEDIATE 'RENAME TABLE SP_AD_B TO SP_AD;';
END IF;
COMMIT WORK;
dbms_output.put_line('SP_AD table issue fixed');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Exception, rolling back transaction, SP_AD not resolved.');
ROLLBACK WORK;
END;
END;
END;
/
本质上,它确定要删除哪个表,然后删除视图并重命名另一个表。
如果我单独运行语句,它工作得很好,但在上面的脚本中,它返回成功执行的过程但没有执行任何操作。
我怀疑它出于某种奇怪的原因回滚,但我很犹豫在没有回滚的情况下执行它(这些表有超过 300,000 条记录)。
谁能告诉我出了什么问题,还有,我的异常块有问题吗?
【问题讨论】:
-
从动态查询中删除终止分号!
-
您不能回滚 DDL 语句。他们也不需要 COMMIT。
-
您对
EXCEPTION块做错的一件事是您捕获所有异常 (WHEN OTHERS) 但您没有将消息写入dbms_output或重新提出它。在EXCEPTION WHEN OTHERS THEN块中添加一行如dbms_output.put_line('Error was ' || SQLERRM);会告诉你问题出在哪里。 -
@LukeWoodward 看起来怎么样?
-
为什么只检索
map_switch的第一条记录?这是一种代码味道,因为它是不确定的。