ROWNUM, select union e insert into

Un problema que me sucedio radicó en que requería hacer desde una vista ya existente un INSERT INTO hacia una tabla destino, esta vista tenía una columna que hacía de identificador, pero al ver la consulta me di cuenta que utilizaba un UNION, era más o menos así:

insert into tabla (id, col1)
select rownum id, xyz from t1
union
select rounum id, zyx from t2

El problema no era la consulta ya que esta arrojaba resultado, la problematica se encontraba que el id generado no era unico, ya que en ambos casos el rownum partía de 1, lo que provocaba un error en el insert into.

La solución fue, crear un trigger que incrementara una secuencia y el valor lo depositara en ID,

create or replace trigger TRG_tabla 
before insert on tabla
   for each row 
begin  
   if inserting then 
      if :NEW.ID is null then 
         select SQ_tabla.nextval into :NEW.ID from dual;
      end if
   end if
end;

eliminar del insret into la columna ID, y luego ejecutar el insert into, con esto se solución el error de clave duplicada.

insert into tabla (col1)
select xyz from t1
union
select  zyx from t2

Comments are closed.