direct path loads cannot be done with an enabled foreign (or triggers).
you could test that direct pathing is available with;
ops$tkyte%ORA11GR2> create table t2 ( x int primary key );
Table created.
ops$tkyte%ORA11GR2> create table t ( x int );
Table created.
ops$tkyte%ORA11GR2> insert /*+ append */ into t select 1 from dual;
1 row created.
ops$tkyte%ORA11GR2> select count(*) from t where 1=0;
select count(*) from t where 1=0
*
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
ops$tkyte%ORA11GR2> rollback;
Rollback complete.
ops$tkyte%ORA11GR2>
ops$tkyte%ORA11GR2> alter table t add constraint t_fk_to_t2 foreign key (x) references t2(x);
Table altered.
ops$tkyte%ORA11GR2>
ops$tkyte%ORA11GR2> insert /*+ append */ into t select 1 from dual;
insert /*+ append */ into t select 1 from dual
*
ERROR at line 1:
ORA-02291: integrity constraint (OPS$TKYTE.T_FK_TO_T2) violated - parent key
not found
ops$tkyte%ORA11GR2> select count(*) from t where 1=0;
COUNT(*)
----------
0
ops$tkyte%ORA11GR2> rollback;
Rollback complete.
you are expecting the select count(*) to fail, if it does not - it did not direct path - you had a foreign key or a trigger in place.
if you are loading on a daily basis, you should be using partitioning (to enable purging later) but also to allow you to manage things in a bit sized chunk.