我有下面提到的插入触发器。 我是 - 检查记录是否已经存在,如果抛出“未找到数据”异常,则对相同的数据进行插入。不是在 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;
答案 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(在客户端中可能被禁用甚至根本不可用)自定义消息,而不是包含您需要的所有详细信息的真正异常?