Q:

ORA-01400 : Strange behavior

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
A, B, C and D are VARCHAR2
E is a DATE
(A,B,C,D, E) is the primary key of 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');

Will result in "ORA-01400: cannot insert NULL in ("USER". "TABLEDESTINATION". "E")"
Now if I use the exact same query, but using a temporary table :
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;

Lines are correctly inserted, without any errors. 
Now I try the same query, but with a NVL for the date :
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) /* <- */
  ;

Lines are correctly inserted, without any errors. 
Logically, it would mean that I have NULL values in the DATA_DATE :
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 
  TABLE1.DATA_DATE IS NULL
;

Returns 0 line
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
;

Returns 0 line
How is it possible that I have no NULL values in DATA_DATE yet Oracle throws me a ORA-01400 ? 
How is it possible that using a temporary table, with the exact same query, I don't get the same error ? 
EDIT :
Like suggested, I also tried using 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

Returns the following error : ORA-12805: parallel query server died unexpectedly
EDIT2 : If I remove the parallel hint, I get this error : "ORA-00001: unique constraint (ZRA.ZRAQX_VENTE_DOPR_MOIS_PK2) violated"
Which I still donc understand, since I am using a GROUP BY on the Primary Key, and I dont have any NULL values...
EDIT3 : I tried using an implicit cursor :
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;

And surprise : It works !  No errors. 
Nothing makes sense any more ...

A:

I found the origin of the bug :
TRUNC(TABLE1.DATA_DATE ,'MONTH') DATA_DATE

If I use this instead :
TRUNC(TABLE1.DATA_DATE ,'MM') DATA_DATE

It Works ! 
I was able to reproduce the error with MONTH after. 
So it really was an Oracle bug with the TRUNC and 'MONTH'
Thank you all for your advices.