ORACLE数据批量插入时,除数为0

来源:百度知道 编辑:UC知道 时间:2024/09/26 14:03:38
如:INSERT INTO A SELECT B.B1/C.C1 FROM B,C WHERE B.B2=C.C2;
实际情况中,B1/C1有可能出现除数为0的情况。SQL就会报错,停止运行。但我需要实现的是当除数为0的时,不去处理,其他数据仍然插入数据库中。
最开始采用了10G新特性,LOGS ERROR INTO的方式,可以解决这种问题。但在开发实际产生的SQL是十分复杂的,运行LOGS ERROR INTO时,ORACLE内部异常了。咨询相关人员后,发现应该是ORACLE的BUG。
SQL改为SELECT B.B1/DECODE(C.C1,0,NULL,C.C1) FROM B,C WHERE B.B2=C.C2这样也是不行的,因为实际业务的SQL是由用户定义的,其复杂度是无法控制的,是可能出现B/C/D或B/(C+D/E)等等复杂的情况,拼写DECODE的方式不可行。
目前采用的解决方案是,按每条记录循环,对有除数为0异常的数据不做处理。但这样的效率极其低下。
请教还有没有其他的解决方案啊?
就是采用的存储过程执行的如上SQL,但SQL会报除数为0错误。所以目前就在存储过程中按照每条记录循环执行,从而捕获除数为0异常。

set serveroutput on
declare
begin
INSERT INTO A SELECT B.B1/C.C1 FROM B,C WHERE B.B2=C.C2;
commit;
exception when ZERO_DIVIDE then
null; --啥也不做,继续下个处理,和高级语言continue差不多
end;
/
或者
INSERT INTO A SELECT B.B1/C.C1 FROM B,C WHERE B.B2=C.C2 and c.c1<>0 and c.c1 is not null;
commit;
我认为数据量不大的话,非0限制比较好吧。
我的SQL可能写的有问题,但是思路应该楼主明白了吧。

INSERT INTO A SELECT B.B1/C.C1 FROM B,C WHERE B.B2=C.C2 AND C.C2 <> 0 AND C.C2 IS NOT NULL

除数是0或者空的,过滤掉呗

可否考虑使用ORACLE的存储过程?