美文网首页Oracle
【oracle】触发器

【oracle】触发器

作者: jiandanyaobai | 来源:发表于2019-05-17 22:49 被阅读0次

一、关于触发器的使用

CREATE OR REPLACE TRIGGER mes_ima_trg
after Insert OR Delete OR Update
  ON IMA_FILE
  REFERENCING new as n old as o
  FOR EACH ROW
DECLARE
   l_erp_status varchar2(3);
   l_tran_status varchar2(3);
   l_timestamp varchar2(17);
   l_cnt number;
   l_userenv varchar2(10);
   l_entid varchar2(10);
   l_imaacti_o varchar2(1);
   l_imaacti_n varchar2(1);
   l_sid varchar2(30);
   l_user varchar2(30);
   l_cnt2 number;

BEGIN
   SELECT USERENV('SESSIONID'),USERENV('SID'),USER INTO l_userenv,l_sid,l_user  FROM dual;
   l_entid := l_user;

   -- Trigger Code begin
   SELECT TO_CHAR(sysdate,'yyyyMMddhh24miss') || SUBSTR(TO_CHAR(sysdate,'SSSSS'),1,3)
   INTO l_timestamp FROM dual;

   SELECT count(*) INTO l_cnt FROM tra_ima_file WHERE tra_imaplant = l_entid
      AND tra_ima01 = :n.ima01 AND tra_imatran_time = l_timestamp;
   /**如果產生相同的一筆資料,必需刪除 **/
   IF (l_cnt > 0) THEN
      DELETE tra_ima_file WHERE tra_imaplant = l_entid AND tra_ima01 = :n.ima01 AND tra_imatran_time = l_timestamp;
   END IF;

   l_imaacti_o := :o.imaacti;
   l_imaacti_n := :n.imaacti;

   CASE
      WHEN inserting THEN
         l_erp_status := 'A';
         l_tran_status := 'AU';

      WHEN updating THEN
         l_erp_status := 'U';
         l_tran_status := 'AU';
         /**確認碼為由Y,或者由Y變更為P,才進行新增,若為P更改為D再進行寫入 **/
         IF (l_imaacti_o = 'Y' AND (l_imaacti_n = 'P' OR l_imaacti_n = 'N')) OR (l_imaacti_n = 'Y' ) THEN
            IF l_imaacti_n = 'P' OR l_imaacti_n = 'N' THEN
               l_imaacti_n := 'N';
               l_tran_status := 'D';
            END IF;

            INSERT INTO tra_ima_file (tra_imaplant,tra_ima01,tra_ima08,tra_imamodu,tra_imatran_time, tra_imastatus, tra_imatran_status,tra_imaacti)
               VALUES (l_entid,:n.ima01,:n.ima08,:n.imamodu,l_timestamp,l_erp_status,l_tran_status,l_imaacti_n);
         END IF;

      WHEN deleting THEN
         l_erp_status := 'D';
         l_tran_status := 'D';

   END CASE;
   -- Trigger Code end

EXCEPTION
WHEN OTHERS THEN
   CASE
      WHEN deleting THEN
         raise_application_error(-20100,'Trigger Error code'||SQLCODE||':'||SQLERRM||'DATAKEY tra_ima01:'||:o.ima01);
      ELSE
         raise_application_error(-20100,'Trigger Error code'||SQLCODE||':'||SQLERRM||'DATAKEY tra_ima01:'||:n.ima01);
   END CASE;
END;

相关文章

网友评论

    本文标题:【oracle】触发器

    本文链接:https://www.haomeiwen.com/subject/ovwaaqtx.html