首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异常处理程序中处理异常

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

Stack Overflow用户
提问于 2020-12-28 19:26:13
回答 2查看 38关注 0票数 0

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

因此,请建议如何在异常处理程序中处理异常。

代码语言:javascript
复制
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;

我尝试了下面的方法,但是没有成功。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-28 22:08:20

子句WHERE LOCAL_CODE LIKE ''||:NEW.COD_EXT_INST_KEY||''无用,只需写成

代码语言:javascript
复制
WHERE LOCAL_CODE LIKE :NEW.COD_EXT_INST_KEY

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

代码语言:javascript
复制
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 (这可能在客户端被禁用,甚至根本不可用)一个自定义消息,而不是包含你所需要的所有细节的真正的异常?

票数 0
EN

Stack Overflow用户

发布于 2020-12-28 19:33:51

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65476879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档