在异常处理程序中处理异常

时间:2020-12-28 11:26:13

标签: oracle plsql

我有下面提到的插入触发器。 我是 - 检查记录是否已经存在,如果抛出“未找到数据”异常,则对相同的数据进行插入。不是在 Exception 中执行此插入操作时,我必须处理一些异常,例如列约束。

所以请建议如何在异常处理程序中处理异常。

CREATE OR REPLACE TRIGGER BRANCH_INSERT_SYNC_TR
AFTER INSERT
   ON PM_FIN_INST_DIR_MAST
   FOR EACH ROW
  FOLLOWS BANK_INSERT_SYNC_TR
  DECLARE
   BRANCHTEMP    VARCHAR (100);
BEGIN
  SELECT BRANCH_KEY
  INTO BRANCHTEMP
  FROM RTBK_BADM_BRANCH_STB
  WHERE LOCAL_CODE LIKE ''
    ||
    :NEW.COD_EXT_INST_KEY
    ||'';
EXCEPTION
WHEN no_data_found THEN
INSERT
INTO RTBK_BADM_BRANCH_STB
  (
    BRANCH_CODE,
    BRANCH_NAME,
    BRANCH_ADDR1,
    BRANCH_ADDR2,
    BRANCH_ADDR3,
    BANK_KEY,
    LOCAL_CODE,
    CITY_KEY,
    POSTAL_CODE,
    TELEPHONE,
    FAX_NO,
    FLEXI_FIELD1,
    FLEXI_FIELD2,
    FLEXI_FIELD3,
    STATUS,
    STATUS_CHANGE_DATE,
    CREATED_BY,
    CREATED_DATE,
    LAST_ACTION,
    MODIFIED_BY,
    MODIFIED_DATE,
    VERSION$,
    FLAG,
    DISPLAY_SEQ
  )
  VALUES
  (
  (select ltrim(:NEW.COD_CC_BRN, '0') from dual),
    --:NEW.COD_CC_BRN,
    :NEW.NAM_BRANCH,
    :NEW.TXT_BRN_ADD1,
    :NEW.TXT_BRN_ADD2,
    :NEW.TXT_BRN_ADD3,
    (SELECT BANK_KEY
    FROM RTBK_BADM_BANK_STB
    WHERE BANK_NAME =
      (:NEW.NAM_BANK)
    ),
    :NEW.COD_EXT_INST_KEY,
    (SELECT CITY_KEY
    FROM RTBK_BADM_CITY_STB
    WHERE CITY_NAME =
      (:NEW.NAM_BRN_CITY)
    ),
    :NEW.TXT_BRN_ZIP,
    NULL,
    NULL,
    'N',
    'IMPS,RTGS,NEFT',
    NULL,
    'A',
    CURRENT_TIMESTAMP,
    'Sync_Trigger',
    CURRENT_TIMESTAMP,
    'INSERT',
    'Sync_Trigger',
    CURRENT_TIMESTAMP,
    1,1,
    NULL
  );
END;
/

ALTER TRIGGER BRANCH_INSERT_SYNC_TR ENABLE;

我尝试了以下方法,但没有成功

CREATE OR REPLACE TRIGGER BRANCH_INSERT_SYNC_TR AFTER
  INSERT ON PM_FIN_INST_DIR_MAST FOR EACH ROW FOLLOWS BANK_INSERT_SYNC_TR DECLARE BRANCHTEMP VARCHAR (100);
  BEGIN
    SELECT BRANCH_KEY
    INTO BRANCHTEMP
    FROM RTBK_BADM_BRANCH_STB
    WHERE LOCAL_CODE LIKE ''
      || :NEW.COD_EXT_INST_KEY
      ||'';
  EXCEPTION
  WHEN no_data_found THEN
  BEGIN
    INSERT
    INTO RTBK_BADM_BRANCH_STB
      (
        BRANCH_CODE,
        BRANCH_NAME,
        BRANCH_ADDR1,
        BRANCH_ADDR2,
        BRANCH_ADDR3,
        BANK_KEY,
        LOCAL_CODE,
        CITY_KEY,
        POSTAL_CODE,
        TELEPHONE,
        FAX_NO,
        FLEXI_FIELD1,
        FLEXI_FIELD2,
        FLEXI_FIELD3,
        STATUS,
        STATUS_CHANGE_DATE,
        CREATED_BY,
        CREATED_DATE,
        LAST_ACTION,
        MODIFIED_BY,
        MODIFIED_DATE,
        VERSION$,
        FLAG,
        DISPLAY_SEQ
      )
      VALUES
      (
        (SELECT ltrim(:NEW.COD_CC_BRN, '0') FROM dual
        )
        ,
        --:NEW.COD_CC_BRN,
        :NEW.NAM_BRANCH,
        :NEW.TXT_BRN_ADD1,
        :NEW.TXT_BRN_ADD2,
        :NEW.TXT_BRN_ADD3,
        (SELECT BANK_KEY FROM RTBK_BADM_BANK_STB WHERE BANK_NAME = (:NEW.NAM_BANK)
        ),
        :NEW.COD_EXT_INST_KEY,
        (SELECT CITY_KEY
        FROM RTBK_BADM_CITY_STB
        WHERE CITY_NAME = (:NEW.NAM_BRN_CITY)
        ),
        :NEW.TXT_BRN_ZIP,
        NULL,
        NULL,
        'N',
        'IMPS,RTGS,NEFT',
        NULL,
        'A',
        CURRENT_TIMESTAMP,
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        'INSERT',
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        1,1,
        NULL
      );
  EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
     DBMS_OUTPUT.put_line('Contraint violated');
  WHEN OTHERS THEN
     DBMS_OUTPUT.put_line('Contraint violated');
    END;
  END;
  /
  ALTER TRIGGER BRANCH_INSERT_SYNC_TR ENABLE;

2 个答案:

答案 0 :(得分:0)

你为什么把事情搞得这么复杂。只需使用标志来指示数据是否存在并相应地插入。

CREATE OR REPLACE TRIGGER BRANCH_INSERT_SYNC_TR AFTER
  INSERT ON PM_FIN_INST_DIR_MAST FOR EACH ROW FOLLOWS BANK_INSERT_SYNC_TR DECLARE 
--BRANCHTEMP VARCHAR (100);
LV_RECORD_COUNT NUMBER := 0;
  BEGIN
    SELECT COUNT(*) -- IT WILL ALWYAS RETURN number
    INTO LV_RECORD_COUNT 
    FROM RTBK_BADM_BRANCH_STB
    WHERE LOCAL_CODE LIKE ''
      || :NEW.COD_EXT_INST_KEY
      ||'';
   IF LV_RECORD_COUNT = 0 THEN -- Use IF
    BEGIN
    INSERT
    INTO RTBK_BADM_BRANCH_STB
      (
        BRANCH_CODE,
        BRANCH_NAME,
        BRANCH_ADDR1,
        BRANCH_ADDR2,
        BRANCH_ADDR3,
        BANK_KEY,
        LOCAL_CODE,
        CITY_KEY,
        POSTAL_CODE,
        TELEPHONE,
        FAX_NO,
        FLEXI_FIELD1,
        FLEXI_FIELD2,
        FLEXI_FIELD3,
        STATUS,
        STATUS_CHANGE_DATE,
        CREATED_BY,
        CREATED_DATE,
        LAST_ACTION,
        MODIFIED_BY,
        MODIFIED_DATE,
        VERSION$,
        FLAG,
        DISPLAY_SEQ
      )
      VALUES
      (
        (SELECT ltrim(:NEW.COD_CC_BRN, '0') FROM dual
        )
        ,
        --:NEW.COD_CC_BRN,
        :NEW.NAM_BRANCH,
        :NEW.TXT_BRN_ADD1,
        :NEW.TXT_BRN_ADD2,
        :NEW.TXT_BRN_ADD3,
        (SELECT BANK_KEY FROM RTBK_BADM_BANK_STB WHERE BANK_NAME = (:NEW.NAM_BANK)
        ),
        :NEW.COD_EXT_INST_KEY,
        (SELECT CITY_KEY
        FROM RTBK_BADM_CITY_STB
        WHERE CITY_NAME = (:NEW.NAM_BRN_CITY)
        ),
        :NEW.TXT_BRN_ZIP,
        NULL,
        NULL,
        'N',
        'IMPS,RTGS,NEFT',
        NULL,
        'A',
        CURRENT_TIMESTAMP,
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        'INSERT',
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        1,1,
        NULL
      );
  EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
     DBMS_OUTPUT.put_line('Contraint violated');
  WHEN OTHERS THEN
     DBMS_OUTPUT.put_line('Other error'); -- use different message for proper debug
    END;
   END IF;
   EXCEPTION -- use Exception if needed here
  WHEN OTHERS THEN
    ..... 
  END;
  /
  ALTER TRIGGER BRANCH_INSERT_SYNC_TR ENABLE;

答案 1 :(得分:0)

子句WHERE LOCAL_CODE LIKE ''||:NEW.COD_EXT_INST_KEY||''没用,直接写

WHERE LOCAL_CODE LIKE :NEW.COD_EXT_INST_KEY

我不是嵌套 SELECT 的粉丝,根本不需要异常。我会像这样编写触发器(实际上我更喜欢 PL/SQL 过程而不是触发器):

CREATE OR REPLACE TRIGGER BRANCH_INSERT_SYNC_TR AFTER
  INSERT ON PM_FIN_INST_DIR_MAST 
  FOR EACH ROW 
  FOLLOWS BANK_INSERT_SYNC_TR 

DECLARE 
   LV_RECORD_COUNT NUMBER;
BEGIN
   SELECT COUNT(*)
   INTO LV_RECORD_COUNT 
   FROM RTBK_BADM_BRANCH_STB
   WHERE LOCAL_CODE LIKE :NEW.COD_EXT_INST_KEY; 

   IF LV_RECORD_COUNT = 0 THEN
      INTO RTBK_BADM_BRANCH_STB (
        BRANCH_CODE,
        ...
        )
      SELECT 
        ltrim(:NEW.COD_CC_BRN, '0'),
        :NEW.NAM_BRANCH,
        :NEW.TXT_BRN_ADD1,
        :NEW.TXT_BRN_ADD2,
        :NEW.TXT_BRN_ADD3,
        BANK_KEY,
        :NEW.COD_EXT_INST_KEY,
        CITY_KEY,
        :NEW.TXT_BRN_ZIP,
        NULL,
        NULL,
        'N',
        'IMPS,RTGS,NEFT',
        NULL,
        'A',
        CURRENT_TIMESTAMP,
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        'INSERT',
        'Sync_Trigger',
        CURRENT_TIMESTAMP,
        1,1,
        NULL
        FROM RTBK_BADM_BANK_STB
            CROSS JOIN CITY_NAME
        WHERE BANK_NAME = :NEW.NAM_BANK
           AND CITY_NAME = :NEW.NAM_BRN_CITY;        
   END IF;
END;

为什么您喜欢 DBMS_OUTPUT(在客户端中可能被禁用甚至根本不可用)自定义消息,而不是包含您需要的所有详细信息的真正异常?