¿Por qué se ejecuta el disparador varias veces al actualizar la tabla en la cuadrícula interactiva?
He creado un disparador para enviar una notificación por correo electrónico si se actualiza una tabla, ahora la tabla es en realidad una cuadrícula interactiva con un botón “Actualizar” que se actualiza mediante un procedimiento PL/SQL y consta de 5 secciones, una vez que la tabla se actualiza, se enviará el correo electrónico 5 veces basado en el número de filas y no quiero que esto suceda.
CREAR O REEMPLAZAR DISPARADOR EMP_NOTIFICATION_TRG
DESPUÉS DE ACTUALIZAR
EN POCT_ASSESSMENT_HEADER
REFERENCIANDO ANTIGUO COMO old, NUEVO COMO new
PARA CADA FILA
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
l_id NUMBER;
l_emp_cpr NUMBER;
l_emp_email VARCHAR2 (100);
BEGIN
IF UPDATING
THEN
IF :OLD.HEADER_ID IS NOT NULL
THEN
SELECT EMP_EMAIL
INTO l_emp_email
FROM POCT_ASSESSMENT_HEADER
WHERE HEADER_ID = :OLD.HEADER_ID;
IF l_emp_email IS NOT NULL
THEN
APEX_MAIL.SEND (
p_to => l_emp_email, --l_official_email,
p_cc => '',
p_bcc => '',
p_from => 'POCT@org.bh',
p_subj => 'Acknowledgment del Asesoramiento',
p_body => '',
p_body_html =>
'<p>Por favor, se le informa que se le ha evaluado en la siguiente prueba:,</p>
<p>Nombre de la prueba: <b>'
|| :old.TEST_NAME
|| '</b></p>
<p>Puntuación de Bondy: <b>'
|| :NEW.BONDY_SCORE
|| '</b></p>
<p>Nivel de logro: <b>'
|| :NEW.LEVEL_ACHIEVEMENT
|| '</b></p>
<p>Fecha: <b>'
|| :NEW.FORM_DATE
|| '</b></p>
');
APEX_MAIL.PUSH_QUEUE;
ELSIF INSERTANDO ENTONCES
NULL;
ELSIF ELIMINANDO LUEGO
NADA;
FIN SI;
FIN SI;
FIN SI;
FIN;
davy.ai
Para evitar que el desencadenador envíe varios correos electrónicos basados en el número de filas actualizadas en la cuadrícula interactiva, puedes modificar el desencadenador para que se ejecute solo una vez por cada actualización, independientemente del número de filas afectadas. Una forma de lograr esto es eliminar la cláusula FOR EACH ROW y utilizar la lógica condicional para verificar si la declaración UPDATE afectó alguna fila en la tabla.
Aquí tienes un ejemplo del código del desencadenador modificado:
Esta versión del desencadenador utiliza la función SQL%ROWCOUNT para determinar si la declaración UPDATE afectó alguna fila y ejecuta el código de notificación de correo electrónico solo una vez. Se elimina la cláusula FOR EACH ROW, ya que no necesitamos ejecutar el desencadenador para cada fila actualizada. Se utiliza la lógica condicional IF-THEN para verificar si se afectaron filas y solo entonces se ejecuta el código de notificación de correo electrónico.
Ten en cuenta que este código modificado del desencadenador asume que la variable l_emp_email debe recuperarse utilizando el valor :OLD.HEADER_ID. Si este no es el caso, es posible que necesites modificar la declaración SELECT en consecuencia.