Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle ORA-01400:奇怪的行为_Oracle_Insert_Null - Fatal编程技术网

Oracle ORA-01400:奇怪的行为

Oracle ORA-01400:奇怪的行为,oracle,insert,null,Oracle,Insert,Null,Oracle数据库11g企业版11.2.0.3.0版-64位生产 A、 B、C和D是VARCHAR2 E是一个日期 (A,B,C,D,E)是TABLEDESTINATION的主键 truncate table TABLEDESTINATION; INSERT /*+ parallel(10) */ INTO TABLEDESTINATION (A,B,C,D, E) SELECT TABLE1.DATA1, TABLE2.DATA2, TABLE2.DATA3,

Oracle数据库11g企业版11.2.0.3.0版-64位生产

A、 B、C和D是VARCHAR2

E是一个日期

(A,B,C,D,E)是TABLEDESTINATION的主键

truncate table TABLEDESTINATION;

INSERT  /*+ parallel(10) */  INTO TABLEDESTINATION (A,B,C,D, 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,  TABLE2.DATA2, TABLE2.DATA3, 
    NVL(TABLE3.DATA4, '-'),  TRUNC(TABLE1.DATA_DATE ,'MONTH');
将导致“ORA-01400:无法在(“用户”、“表格目的地”、“E”)中插入NULL”

现在,如果使用完全相同的查询,但使用临时表:

truncate table TABLEDESTINATION;

CREATE TABLE TEST_TABLE AS
  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, TABLE2.DATA2, TABLE2.DATA3, 
    NVL(TABLE3.DATA4, '-'),  
    TRUNC(TABLE1.DATA_DATE ,'MONTH');

INSERT  /*+ parallel(10) */  INTO TABLEDESTINATION (A,B,C,D, E)
  select DATA1,DATA2,DATA3, DATA4, DATA_DATE
  from TEST_TABLE;
正确插入行,没有任何错误。

现在我尝试相同的查询,但日期为NVL:

INSERT  /*+ parallel(10) */  INTO TABLEDESTINATION (A,B,C,D, E)
  SELECT
    TABLE1.DATA1,
    TABLE2.DATA2,
    TABLE2.DATA3,
    NVL(TABLE3.DATA4, '-') DATA4,
    /* -> */ 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,  TABLE2.DATA2, TABLE2.DATA3, 
    NVL(TABLE3.DATA4, '-'),  
    /* -> */ NVL(TRUNC(TABLE1.DATA_DATE ,'MONTH'), SYSDATE) /* <- */
  ;
返回0行

SELECT
  TABLE1.DATA1,
  TABLE2.DATA2,
  TABLE2.DATA3,
  NVL(TABLE3.DATA4, '-') DATA4,
  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
WHERE 
  TRUNC(TABLE1.DATA_DATE) IS NULL
;
返回0行

SELECT
  TABLE1.DATA1,
  TABLE2.DATA2,
  TABLE2.DATA3,
  NVL(TABLE3.DATA4, '-') DATA4,
  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
WHERE 
  TRUNC(TABLE1.DATA_DATE) IS NULL
;
我的数据中怎么可能没有空值,而Oracle却向我抛出了ORA-01400

使用一个临时表,使用完全相同的查询,我怎么可能不会得到相同的错误呢

编辑: 正如建议的那样,我还尝试使用DISTINCT:

INSERT  /*+ parallel(10) */  INTO TABLEDESTINATION (A,B,C,D, E)
  SELECT DISTINCT
    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
返回以下错误:ORA-12805:并行查询服务器意外死亡

EDIT2:如果删除并行提示,则会出现以下错误:“ORA-00001:违反了唯一约束(ZRA.ZRAQX\u VENTE\u DOPR\u MOIS\u PK2)。” 我仍然不明白,因为我在主键上使用了GROUP BY,并且我没有任何空值

EDIT3:我尝试使用隐式光标:

FOR CURTEST IN (/* same select as above */) LOOP
INSERT INTO TABLEDESTINATION (A,B,C,D,E) values (CURTEST.DATA1,CURTEST.DATA2,CURTEST.DATA3,CURTEST.DATA4, CURTEST.DATA_DATE);
END LOOP;
令人惊讶的是:它起作用了!没有错误


再也没有什么意义了……

我找到了错误的根源:

TRUNC(TABLE1.DATA_DATE ,'MONTH') DATA_DATE
如果我改用这个:

TRUNC(TABLE1.DATA_DATE ,'MM') DATA_DATE
它起作用了

我能够在一个月后重现错误

所以这真的是一个带有TRUNC和'MONTH'的甲骨文bug


谢谢大家的建议。

但是INSERT INTO TABLE DESTINGE select*from TEST_TABLE是如何工作的(请参见查询2的结尾)?正如我所说的,数据中没有像前面解释的那样的空值(参见查询4和查询5)。而且没有触发器。E永远不会获取实际的系统日期,因此从不使用NVL。正如您所说,它看起来像一个bug,但由于99%的人说它是bug,实际上是人为错误;)唯一的约束是主键。因此它有一个隐式的NOTNULL约束。但没有默认值。我的DBA也在考虑这个问题,但到目前为止运气不佳。我忘了提到:我在插入中使用了并行提示。我可以尝试不使用它,但它将花费我大约11个小时的运行时间。。。。