我有一个具有多个IF语句的触发器(不是ifif)。我确实把代码带回了两次相同的IF语句,但只运行了第一个IF语句。
这是标准的Oracle触发器行为吗?其中一个if语句几乎是硬编码的,而另一个使用了一个函数,因此只有少数情况下两个IF都要运行。
有没有不同的方法来处理这样的问题?或问题是否在触发器代码中,我应该在这里发布吗?
下面的代码在我们的服务器上有此行为,但是从原始代码中删除了。
create or replace TRIGGER V_INV_TRANS_BIZTALK
AFTER INSERT ON INVENTORY_TRANSACTION
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
l_type pre_advice_header.user_def_type_4%type;
l_status order_header.status%TYPE;
l_from_loc_zone location.zone_1%TYPE;
l_to_loc_zone location.zone_1%TYPE;
l_patype pre_advice_header.pre_advice_type%type;
l_retour pre_advice_header.user_def_type_6%TYPE;
l_client pre_advice_header.client_id%TYPE;
BEGIN
l_client := :new.client_id;
--Client_id = SD
IF l_client = 'SD'
THEN
CASE
--InBound + Return : Pre_Advice_header
WHEN (:new.code = 'PreAdv Status' and :new.notes in ('In Progress --> Complete')) THEN
select PRE_ADVICE_TYPE
into l_patype
from pre_advice_header
where pre_advice_id = :new.reference_id
and client_id = :new.client_id;
END CASE;
END IF;
--TRANSPARIX
IF l_client = 'SD'
--(beldba.is_transparix_client(p_client_id => :new.client_id) = '1' )
THEN
CASE
--Order is shipped
WHEN (:new.notes like ('%--> Shipped')) THEN
--TRANSEXT
INSERT INTO beldba.biztalk_trigger
(
event_id,
status,
system_id,
client_id,
reference_id,
receiver_id,
user_def_type_1
)
VALUES
(
'TRANSExt',
'Pending',
'DCS',
:new.client_id,
:new.reference_id,
'TRANSPARIX',
''
);
END CASE;
END IF;
COMMIT;
EXCEPTION when others then
NULL;
END;
答案 0 :(得分:2)
我认为这里存在两个问题:
如果CASE
语句中没有匹配的情况,并且没有ELSE
子句,则CASE
语句将引发ORA-06592错误'未找到CASE执行CASE语句时'。如果您在没有匹配的情况下不想做任何事情,请将以下部分添加到CASE
声明中:
ELSE
NULL;
您使用
结束触发器EXCEPTION when others then
NULL;
这会吞下所有异常,包括Oracle提出的异常,告诉你它无法找到CASE
来执行。当然,因为这是触发器的结束,一旦你的触发器引发异常,就不会执行进一步的触发器代码。
EXCEPTION WHEN OTHERS THEN NULL
是甲骨文的罪魁祸首。我不能强烈建议您删除触发器的这一部分。 答案 1 :(得分:1)
删除案例陈述并替换为IF语句解决了这个问题。