Depurar INSERT SELECT o MERGE en Oracle
Por amunoz el Viernes, 16 de Abril de 2021, 17:45 - Enlace permanente
Si te encuentras con errores a la hora de insertar registros en una tabla a través de una instrucción MERGE o al realizar un INSERT SELECT quizás te interese en saber cómo depurar estos errores.
Oracle nos proporciona las herramientas para realizar un registro de los errores que pudiéramos tener al usar este tipo de instrucciones.
Para ello necesitamos crear una tabla de log donde registrar esos errores, esta tabla de log se puede crear mediante la siguiente instrucción:
CALL DBMS_ERRLOG.CREATE_ERROR_LOG ( 'TABLA', -- Tabla en la que vamos a insertar registros mediante MERGE o INSERT SELECT 'TABLA_ERRORES', -- Tabla que vamos a crear para registrar los errores 'OWNER' -- Esquema );
Al ejecutar la instrucción anterior se creará la tabla que tendrá una serie de campos para almacenar el tipo de error producido y luego otro conjunto de campos que coincidirá con la tabla en la que intentamos insertar datos.
Si en nuestra tabla tenemos un campo ID que es Primary Key y por lo tanto será único, al ejecutar la siguiente consulta nos dará un error y quedará grabado en la tabla de log.
INSERT INTO TABLA_PRUEBAS (ID, NOMBRE) SELECT ROWNUM, V.NOMBRE FROM DATOS V LOG ERRORS INTO TABLA_ERRORES;
O en su forma MERGE:
MERGE INTO TABLA_PRUEBAS T USING ( SELECT * FROM DATOS ) V ON (T.ID = V.ID) WHEN NOT MATCHED THEN INSERT (ID, NOMBRE) VALUES (1, V.NOMBRE) LOG ERRORS INTO TABLA_ERRORES;
En cualquier caso, si consultamos los datos de la tabla TABLA_ERRORES veremos el error producido y además el registro exacto que ha dado conflicto de la tabla donde queremos hacer la inserción.