假如将A表中的数据,选择几个字段插入B表
用批量的方法:
insert into b
select cc,dd
from a;B的字段全部是非空
A的字段都可能为空如果插入的过程中程序报错了,是由于非空限制造成的。
请问:
我该如何定位是A中的哪个数据引起错误的?
用批量的方法:
insert into b
select cc,dd
from a;B的字段全部是非空
A的字段都可能为空如果插入的过程中程序报错了,是由于非空限制造成的。
请问:
我该如何定位是A中的哪个数据引起错误的?
解决方案 »
- Enterprise Manager 无法连接到数据库实例。下面列出了组件的状态。
- 在请教一个PLSQL问题
- ORACLE 9 数据库redo日志被全部删除了,如何能够重新把数据库启动起来?急!急!急!在线等待……
- spool导出一个文本文件,如何得到导出的记录数?
- 如何定位到表类型变量中的某一条记录?
- oracle建表指定表空间。。。
- 判断表在oracle数据库中是否存在?
- 在线急等,分数急给: 如何让数据库A加载数据库B的一个表空间?
- 从返回的数据集中过滤出第n条到n+m条记录,Limit, offset 怎么用?
- 哪位高手能给我篇在TRU64上安装oracle920的安装文档?
- 同时插入问题
- 基础,导出导入表,麻烦解疑下
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上做啊。