sql >> Base de Datos >  >> RDS >> Oracle

¿Oracle equivalente a MySQL INSERT IGNORE?

Consulte la declaración MERGE. Esto debería hacer lo que quieras:es el WHEN NOT MATCHED cláusula que hará esto.

Sin embargo, debido a la falta de soporte de Oracle para una cláusula VALUES() verdadera, la sintaxis para un solo registro con valores fijos es bastante torpe:

MERGE INTO your_table yt
USING (
   SELECT 42 as the_pk_value, 
          'some_value' as some_column
   FROM dual
) t on (yt.pk = t.the_pke_value) 
WHEN NOT MATCHED THEN 
   INSERT (pk, the_column)
   VALUES (t.the_pk_value, t.some_column);

Un enfoque diferente (si, por ejemplo, está realizando una carga masiva desde una tabla diferente) es utilizar la función "Registro de errores" de Oracle. La declaración se vería así:

 INSERT INTO your_table (col1, col2, col3)
 SELECT c1, c2, c3
 FROM staging_table
 LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;

Luego, todas las filas que habrían arrojado un error están disponibles en la tabla errlog . Necesitas crear ese errlog tabla (o el nombre que elija) manualmente antes de ejecutar la inserción usando DBMS_ERRLOG.CREATE_ERROR_LOG .

Consulte el manual para obtener más información