我有下面提到的插入触发器。我正在检查记录是否已经存在,如果抛出了“找不到数据”异常,则对相同的数据执行插入操作。在异常中执行此插入时,我必须处理一些异常,如列条件。
因此,请建议如何在异常处理程序中处理异常。
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;发布于 2020-12-28 22:08:20
子句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 (这可能在客户端被禁用,甚至根本不可用)一个自定义消息,而不是包含你所需要的所有细节的真正的异常?
发布于 2020-12-28 19:33:51
为什么你要把事情搞得这么复杂。只需使用flag来指示数据是否存在,并相应地执行插入。
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;https://stackoverflow.com/questions/65476879
复制相似问题