大佬教程收集整理的这篇文章主要介绍了oracle – ORA-01400:奇怪的行为,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
A,B,C和D是VARCHAR2
E是DATE
(A,C,D,E)是tableDESTinATION的主要关键
truncate table tableDESTinATION; INSERT /*+ parallel(10) */ INTO tableDESTinATION (A,E) SELECT table1.DATA1,table2.DATA2,table2.DATA3,NVL(table3.DATA4,'-') DATA4,Trunc(table1.DATA_DATE,'MONTH') DATA_DATE FROM table1 INNER JOIN table2 ON table1.DATA1 = table2.DATA1 AND table1.Z = table2.Z left JOIN table3 ON table1.X=table3.X GROUP BY table1.DATA1,'-'),'MONTH');
将导致“OrA-01400:无法插入NulL(”USER“.”tableDESTinATION“.”E“)”
现在,如果我使用完全相同的查询,但使用临时表:
truncate table tableDESTinATION; create table test_table AS SELECT table1.DATA1,'MONTH'); INSERT /*+ parallel(10) */ INTO tableDESTinATION (A,E) SELEct DATA1,DATA2,DATA3,DATA4,DATA_DATE from test_table;
正确插入行,没有任何错误.
现在我尝试相同的查询,但使用日期的NVL:
INSERT /*+ parallel(10) */ INTO tableDESTinATION (A,/* -> */ NVL(Trunc(table1.DATA_DATE,'MONTH'),sysdate) /* <- */ DATA_DATE FROM table1 INNER JOIN table2 ON table1.DATA1 = table2.DATA1 AND table1.Z = table2.Z left JOIN table3 ON table1.X=table3.X GROUP BY table1.DATA1,sysdate) /* <- */ ;
正确插入行,没有任何错误.
从逻辑上讲,这意味着我在DATA_DATE中有NulL值:
SELECT table1.DATA1,NVL(Trunc(table1.DATA_DATE,sysdate) DATA_DATE FROM table1 INNER JOIN table2 ON table1.DATA1 = table2.DATA1 AND table1.Z = table2.Z left JOIN table3 ON table1.X=table3.X WHERE table1.DATA_DATE IS NulL ;
返回0行
SELECT table1.DATA1,sysdate) DATA_DATE FROM table1 INNER JOIN table2 ON table1.DATA1 = table2.DATA1 AND table1.Z = table2.Z left JOIN table3 ON table1.X=table3.X WHERE Trunc(table1.DATA_DATE) IS NulL ;
返回0行
怎么可能在DATA_DATE中没有NulL值但是Oracle却抛出了一个ORA-01400?
如何使用临时表,使用完全相同的查询,我没有得到相同的错误?
编辑:
像建议的那样,我也尝试过使用disTinCT:
INSERT /*+ parallel(10) */ INTO tableDESTinATION (A,E) SELECT disTinCT table1.DATA1,'MONTH') DATA_DATE FROM table1 INNER JOIN table2 ON table1.DATA1 = table2.DATA1 AND table1.Z = table2.Z left JOIN table3 ON table1.X=table3.X
返回以下错误:ORA-12805:并行查询服务器意外死亡
EDIT2:如果我删除并行提示,我收到此错误:“OrA-00001:违反了唯一约束(ZRA.ZRAQX_VENTE_dopR_MOIS_PK2)”
我仍然不明白,因为我在主键上使用GROUP BY,而且我没有任何NulL值…
EDIT3:我尝试使用隐式游标:
FOR CURTEST IN (/* same SELEct as above */) LOOP INSERT INTO tableDESTinATION (A,E) values (CURTEST.DATA1,CURTEST.DATA2,CURTEST.DATA3,CURTEST.DATA4,CURTEST.DATA_DATE); END LOOP;
而且意外:它有效!没有错误.
没有任何意义了……
以上是大佬教程为你收集整理的oracle – ORA-01400:奇怪的行为全部内容,希望文章能够帮你解决oracle – ORA-01400:奇怪的行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。