假如将A表中的数据,选择几个字段插入B表
用批量的方法:
insert into b
select cc,dd
from a;B的字段全部是非空
A的字段都可能为空如果插入的过程中程序报错了,是由于非空限制造成的。
请问:
我该如何定位是A中的哪个数据引起错误的?
用批量的方法:
insert into b
select cc,dd
from a;B的字段全部是非空
A的字段都可能为空如果插入的过程中程序报错了,是由于非空限制造成的。
请问:
我该如何定位是A中的哪个数据引起错误的?
select cc,dd
from a
where a.** is not null;你把非空的过滤调不仅好了
这样的方法挺好的,另外也可以在执行插入语句之前先修复A表中的数据。确保A表中要插入到B表的字段没有空值,在设计表的时候给一个默认值就行了。也可以用nvl(字段,替代值)函数来确保没有空值。nvl函数参考
insert into b
select nvl(cc,0),nvl(dd,0)
from a;
要是业务复杂,你可以自定义EXCEPTION。DECLARE
v_err_detp_id dept%TYPE;
CURSOR the_cursor IS SELECT dept_id FROM dept;
v_dept_arr the_cursor%rowtype;
v_insert_sql VARCHAR2(100);
BEGIN
OPEN the_cursor ;
LOOP
FETCH the_cursor INTO v_dept_arr;
EXIT WHEN the_cursor%NOTFOUND;
v_err_detp_id:=v_dept_arr.dept_id;
execute IMMEDIATE v_insert_sql using v_dept_arr.dept_id;
END LOOP;
CLOSE the_cursor;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('ERR_DEPT_ID:' || v_err_detp_id);
end;
END;
/
用Logmnr分析下DML日志呢?
或者看看alter<sid>.log日志
http://space.itpub.net/12778571/viewspace-503191
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('ERR_DEPT_ID:' || v_err_detp_id);
end这里捕获他的异常就可已了,就跟普通程序里的Try Catch ex As System.Exception End Try这样做一样。
你在程序上这时候怎么做照样也可以在PL/SQL上做啊。