Saltar al contenido

Insertar Oracle si la fila no existe

Buscamos por internet y de esta forma tenerte la solución para tu duda, si continúas con alguna inquietud puedes dejarnos tu pregunta y respondemos porque estamos para ayudarte.

Solución:

Cuando ejecuto esto, aparece el error “falta la palabra clave INTO”.

Porque IGNORE no es una palabra clave en Oracle. Esa es la sintaxis de MySQL.

Lo que puedes hacer es usar MERGE.

merge into table1 t1
    using (select 'value1' as value1 ,value2 
           from table2 
           where table2.type = 'ok' ) t2
    on ( t1.value1 = t2.value1)
when not matched then
   insert values (t2.value1, t2.value2)
/

Desde Oracle 10g podemos usar merge sin manejar ambas ramas. En 9i tuvimos que usar una rama MATCHED “ficticia”.

En versiones más antiguas, las únicas opciones eran:

  1. probar la existencia de la fila antes de emitir un INSERTAR (o en una subconsulta);
  2. usar PL/SQL para ejecutar INSERT y manejar cualquier error DUP_VAL_ON_INDEX resultante.

Tenga en cuenta que si tiene la suerte de trabajar con la versión 11g Release 2, puede usar la sugerencia IGNORE_ROW_ON_DUPKEY_INDEX.

INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(table1(id)) */ INTO table1 SELECT ...

De la documentación: http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/sql_elements006.htm#CHDEGDDG

Un ejemplo de mi blog: http://rwijk.blogspot.com/2009/10/three-new-hints.html

Saludos, roberto

¡Porque escribiste la palabra falsa “ignorar” entre “insertar” y “en”!

insert ignore into table1 select 'value1',value2 from table2 where table2.type = 'ok'

Debiera ser:

insert into table1 select 'value1',value2 from table2 where table2.type = 'ok'

Del título de su pregunta “insertar oráculo si la fila no existe”, supongo que pensó que “ignorar” era una palabra clave de Oracle que significa “no intente insertar una fila si ya existe”. Tal vez esto funcione en algún otro DBMS, pero no en Oracle. Puede usar una instrucción MERGE o verificar la existencia de esta manera:

insert into table1 
select 'value1',value2 from table2 
where table2.type = 'ok'
and not exists (select null from table1
                where col1 = 'value1'
                and col2 = table2.value2
               );

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *