Oracle 11.2 et le hint IGNORE_ROW_ON_DUPKEY_INDEX

Le hint IGNORE_ROW_ON_DUPKEY_INDEX est une autre nouvelle fonctionnalité d’Oracle 11.2. Ce hint permet, comme son nom le suggère, d’ignorer une ligne qui aurait déjà été insérée dans une table. L’INSERT continue simplement en ignorant la ligne dont la valeur de clé existe déjà la table. Pour se faire une idée, rien ne vaut un exemple simple.
Dans un premier temps, créez une table avec une clé; dans ce cas, il s’agit d’une clé primaire mais une clé unique suffit :

create table t
    (id number primary key,
     text varchar2(100));
insert into t values (1,'1');
commit;

La clé primaire empêche d’insérer à nouveau une ligne dont la colonne id est 1, comme vous pouvez le voir ci-dessous :

insert into t values (1,'New 1');
insert into t values (1,'New 1')
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.SYS_C009876) violated

Maintenant, voyons ce que ça donne avec notre nouveau hint :

insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX (t(id)) */
  into t
  (select 1,'New 1' from dual);
0 rows created.
col id format 99
col text format a10
select * from t;
 ID TEXT
--- ----------
   1 1

Et voilà 0 ligne insérée mais pas de message d’erreur. J’avoue qu’à priori on peut faire la même chose avec une commande MERGE; sauf probablement si vous avez plusieurs clés sur la table. Quoiqu’il en soit, c’est encore une des nouvelles fonctionnalités d’Oracle 11.2; d’autres sont à venir dans les prochains jours…