Extraer nombre/campo y datos ORACLE

Datos de la estructura de la tabla
-------------------------------------------------------
Column_id         Column_name    Data_type
-------------------------------------------------------
1                             Nombre        char
2                             Apellido        char    
3                             Direccion      char
4                             Telefono      char
5 Fecha date
Datos de la tabla
------------------------------------------------------------------------
Nombre Apellido Dirección Teléfono Fecha
------------------------------------------------------------------------
Juan Perez San Salvador 2610-2121 01/01/2010
La consulta es de que manera puedo realizar un trigger que pueda concatenar en un solo string (para Insertar/Actualizar) en el cual
me arme los datos dinámicamente el nombre del campo+el contenido del campo así:
Nombre: Juan Apellido: Perez Dirección: San Salvador Teléfono: 2610-2121 Fecha:01/01/2010
Todo esto para poderlo enviar a una tabla de traza de auditoria, tome un ejemplo pero no me funciona:

CREATE OR REPLACE TRIGGER "ESQUEMA_PRUEBA"."CREACION" BEFORE
INSERT ON "TABLA_PRUEBA" FOR EACH ROW
declare    
   n_traza number;
   oldval varchar(2000);
   newval varchar(1000);
begin
  SELECT sysdate INTO :new.fecha_creacion FROM dual;
  select SEC_AUDITORIA.nextval into n_traza from dual;
   for row in (SELECT column_name from user_tab_columns where table_name='TABLA_PRUEBA') loop  
     execute immediate 'select :old.'||row.column_name||' from dual'   into oldval;  
     execute immediate 'select :new.'||row.column_name||' from dual'   into newval;  
   end loop;  
  insert into traza_auditoria (id_traza,usuario,fecha,operacion,datos)
  values(99,:new.usuario_creacion,:new.fecha_creacion,'INSERCIÓN',newval);
end;

1 respuesta

Respuesta
-1
Espero haber comprendido tu problema: tienes una tabla donde insertas registros tipo directorio y tienes otra para bitácora de inserciones y has creado el trigger Before Insert para guardar en la bitácora, si es así, veo innecesario un par de cosas: uno es el Loop que haces, ya que el trigger se dispara cada vez que realiza un INSERT y si no mal entiendo lo ocupas para capturar los nombres de los campos y sus valores, si la tabla es fija, es decir si no cambia su estructura con frecuencia puedes generar el texto de igual forma: fijo; lo otro que no utilizas es el valor OLD, ya que al ser un trigger de INSERT estos son NULL y de todos modos al final no los guardas, pero mejor te pongo como creo que te pudiera funcionar de una forma más sencilla:
Create or replace trigger "esquema_prueba"."creacion" before
INSERT ON "TABLA_PRUEBA" FOR EACH ROW
DECLARE
n_traza number;
v_datos varchar2(2000);
begin    
  select SEC_AUDITORIA.nextval into n_traza from dual;
  v_datos:= 'Nombre: '||:new.nombre||' Apellido: '||:new.apellido||' Direccion: '||:new.direccion||' Telefono: '||:new.telefono||' Fecha: '||:new.fecha;
  insert into traza_auditoria (id_traza,usuario,fecha,operacion,datos)
  values(n_traza,:new.usuario_creacion,SYSDATE,'INSERCION',v_datos);
end;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas