Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Duda de PL/SQL

Estas en el tema de Duda de PL/SQL en el foro de Oracle en Foros del Web. Buenas tardes, estoy manteniendo una base de datos, y me encontré con algo que se me hace un poco eficiente. Existe un trigger que lo ...
  #1 (permalink)  
Antiguo 08/03/2011, 15:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Duda de PL/SQL

Buenas tardes, estoy manteniendo una base de datos, y me encontré con algo que se me hace un poco eficiente.

Existe un trigger que lo que hace es revisar los datos y ver los cambios (un audit), pero hacen un IF por cada campo a auditar, y el trigger es bastante extenso (básicamente es el mismo código dentro de cada IF) y tengo la duda si se puede usar algo como un loop, y declarar un arreglo de campos para comparar.

Gracias por sus respuestas.
Saludos.
  #2 (permalink)  
Antiguo 09/03/2011, 08:13
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Duda de PL/SQL

Hola gatov

Si el codigo es demasiado largo, postea un fragmento del codigo y el tipo de campos que audita.

Tal vez si se pueda lograr un loop valiendose del diccionario de datos para hacer l¿por lo menos, mas administrable el codigo.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/03/2011, 11:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Duda de PL/SQL

Pues es largo pero básicamente es algo así:
Código SQL:
Ver original
  1. IF NVL(:NEW.last_name,0) <> NVL(:OLD.last_name,0) THEN
  2.  
  3.        v_act_record := v_act_record +1;
  4.        V_CHANGE := 1;
  5.  
  6.     INSERT INTO audit
  7.   (audit_num,
  8.   attribute_name,
  9.   old_value,
  10.   new_value,
  11.   date_time)
  12.   VALUES
  13.   (v_act_record,
  14.   'last_name',
  15.   :OLD.last_name,
  16.   :NEW.last_name,
  17.   SYSDATE);
  18.  
  19.     END IF;

Repetido unas 30 veces o más... pensaba usar un loop o algo similar para que el agregar o quitar campos auditados fuera más sencillo...
  #4 (permalink)  
Antiguo 09/03/2011, 12:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Duda de PL/SQL

Me imagino que el trigger se dispara deacuerdo a un evento en una sola tabla.
Y que last_name es una columna de dicha tabla.

Si las veces que se repiten estos condicionales IF(30 o mas) corresponde a la cantidad de columnas que tiene la tabla (Por ejemplo... si comparas last_name, luego telephone, luego address y todas las comparaciones son sobre una misma tabla) podrías probar haciendo uso de la vista USER_TAB_COLUMNS.

Un ejemplo:
Código SQL:
Ver original
  1. SQL> SELECT column_name FROM user_tab_columns WHERE TABLE_NAME='EMPLOYEES';
  2.  
  3. COLUMN_NAME
  4. ------------------------------
  5. EMPLOYEE_ID
  6. FIRST_NAME
  7. LAST_NAME
  8. EMAIL
  9. PHONE_NUMBER
  10. HIRE_DATE
  11. JOB_ID
  12. SALARY
  13. COMMISSION_PCT
  14. MANAGER_ID
  15. DEPARTMENT_ID
  16.  
  17. 11 filas seleccionadas.

Mira en este enlace la forma como utilizan los cursores explicitos para almacenar los resultados de una consulta.
Si en un arreglo puedes guardar el resultado de esa consulta, podría haber un loop que recorriera el cursor y aplicara las operaciones que muestras para cada registro encontrado.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 14/03/2011, 15:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Duda de PL/SQL

Interesante, lo voy a intentar, no son todas las columnas, pero he visto como hacer un loop de un array declarado en el Trigger

Etiquetas: plsql, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:52.