Oracle Trigger仅激活第一个IF语句

时间:2015-09-11 09:45:24

标签: oracle triggers

我有一个具有多个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;

2 个答案:

答案 0 :(得分:2)

我认为这里存在两个问题:

  1. 如果CASE语句中没有匹配的情况,并且没有ELSE子句,则CASE语句将引发ORA-06592错误'未找到CASE执行CASE语句时'。如果您在没有匹配的情况下不想做任何事情,请将以下部分添加到CASE声明中:

    ELSE
      NULL;
    
  2. 您使用

    结束触发器
    EXCEPTION when others then
      NULL;
    

    这会吞下所有异常,包括Oracle提出的异常,告诉你它无法找到CASE来执行。当然,因为这是触发器的结束,一旦你的触发器引发异常,就不会执行进一步的触发器代码。

    坦率地说,{p> EXCEPTION WHEN OTHERS THEN NULL是甲骨文的罪魁祸首。我不能强烈建议您删除触发器的这一部分。

答案 1 :(得分:1)

删除案例陈述并替换为IF语句解决了这个问题。