es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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;
Tags:  , , ,

Answer

  1. Avatar for 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:

    CREATE OR REPLACE TRIGGER EMP_NOTIFICATION_TRG
    AFTER UPDATE 
    ON POCT_ASSESSMENT_HEADER
    DECLARE
      l_rows_affected NUMBER;
      l_emp_email      VARCHAR2 (100);
    BEGIN
      l_rows_affected := SQL%ROWCOUNT;
      IF l_rows_affected > 0 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, 
            p_cc     => '',
            p_bcc    => '',
            p_from   => 'POCT@org.bh',
            p_subj   => 'Confirmación de evaluación',
            p_body   => '',
            p_body_html   =>
              '<p>Ten en cuenta que has sido evaluado para la siguiente prueba:</p>' ||
              '<p>Nombre de la prueba: <b>' || :old.TEST_NAME || '</b></p>' ||
              '<p>Puntuación 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;
        END IF;
      END IF;
    END;
    

    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.

Comments are closed.