Oracle   发布时间:2022-05-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了oracle – ORA-01400:奇怪的行为大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Oracle Database 11g企业版11.2.0.3.0版 – 64位生产

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;

而且意外:它有效!没有错误.

没有任何意义了……

解决方法

发现了这个BUG的起源:

Trunc(table1.DATA_DATE,'MONTH') DATA_DATE

如果我改用它:

Trunc(table1.DATA_DATE,'MM') DATA_DATE

有用 !

之后我能用MONTH重现错误.

所以它确实是Trunc和’MONTH’的Oracle错误

谢谢大家的意见.

大佬总结

以上是大佬教程为你收集整理的oracle – ORA-01400:奇怪的行为全部内容,希望文章能够帮你解决oracle – ORA-01400:奇怪的行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: