2016-06-14 67 views
0

我有一个case语句的触发器。在ELSE块代码的最后一部分,我希望触发器不做任何事情,并且如果值在前面的CASE语句中不匹配,则退出。我如何做到这一点:CASE语句无所作为

create or replace TRIGGER "CONVEYANCE_REQUEST_T3" 
BEFORE 
insert or update on "CONVEYANCE_REQUEST" 
for each row 
begin 

CASE 
when :NEW.REGULAR_TRAVEL_MODE = '2 WHEELER' THEN 
BEGIN 
    CASE 
     when :NEW.WAY_TYPE = 'ONE WAY' THEN 
       SELECT RATE_PER_KM * (SELECT DISTANCE_ONEWAY FROM  DISTANCE_MASTER WHERE PROJECT_CODE = :NEW.PROJECT_CODE) * 1 INTO  :NEW.REGULAR_AMOUNT FROM CONVEYANCE_RATE WHERE TRAVEL_MODE = :NEW.REGULAR_TRAVEL_MODE; 
     WHEN :NEW.WAY_TYPE ='TWO WAY' THEN 
       SELECT RATE_PER_KM * (SELECT DISTANCE_ONEWAY FROM DISTANCE_MASTER WHERE PROJECT_CODE = :NEW.PROJECT_CODE) * 2 INTO :NEW.REGULAR_AMOUNT FROM CONVEYANCE_RATE WHERE TRAVEL_MODE = :NEW.REGULAR_TRAVEL_MODE; 
    END CASE; 
END; 
when :NEW.REGULAR_TRAVEL_MODE = '4 WHEELER' THEN 
BEGIN 
    CASE 
     when :NEW.WAY_TYPE = 'ONE WAY' THEN 
       SELECT RATE_PER_KM * (SELECT DISTANCE_ONEWAY FROM DISTANCE_MASTER WHERE PROJECT_CODE = :NEW.PROJECT_CODE) * 1 INTO :NEW.REGULAR_AMOUNT FROM CONVEYANCE_RATE WHERE TRAVEL_MODE = :NEW.REGULAR_TRAVEL_MODE; 
     WHEN :NEW.WAY_TYPE ='TWO WAY' THEN 
       SELECT RATE_PER_KM * (SELECT DISTANCE_ONEWAY FROM DISTANCE_MASTER WHERE PROJECT_CODE = :NEW.PROJECT_CODE) * 2 INTO :NEW.REGULAR_AMOUNT FROM CONVEYANCE_RATE WHERE TRAVEL_MODE = :NEW.REGULAR_TRAVEL_MODE; 
    END CASE; 
END; 
ELSE 
    ****statement to just exit & not do anything***** 

END CASE; 
END; 
+2

如果你不想它做任何事情,那么不要把其他东西放在那里? – Chris

+0

我累了..但是当我想插入我使用APEX应用程序记录时,它给出了以下错误:发生了1个错误 ORA-06592:执行CASE语句时未找到CASE ORA-06512:在“BABBLER_GROUP.CONVEYANCE_REQUEST_T3” ,第3行ORA-04088:执行触发器'BABBLER_GROUP.CONVEYANCE_REQUEST_T3'时出错' – Teju

+3

也许'else null;'? –

回答

2

这是一个非常复杂的情况下发言,基本上是重复每次相同的排序select语句。

由于每个语句之间的唯一差别是乘数是1还是2,你可以只改写整个事情在一个case语句包含SQL语句的情况下,表情像这样:

create or replace trigger "CONVEYANCE_REQUEST_T3" 
before 
insert or update on "CONVEYANCE_REQUEST" 
for each row 
begin 
    case when rate_per_km in ('2 WHEELER', '4 WHEELER') 
      and new.way_type in ('ONE WAY', 'TWO WAY') then 
      select rate_per_km 
        * (select distance_oneway from distance_master where project_code = :new.project_code) 
        * case when :new.way_type = 'ONE WAY' 
           then 1 
          when :new.way_type = 'TWO WAY' 
           then 2 
          else null 
        end regular_amount 
      into :new.regular_amount 
      from conveyance_rate where travel_mode = :new.regular_travel_mode; 
     else null; 
    end case; 
end; 
/

你甚至可以逃脱,因为没有外壳语句(尽管你必须将rate_per_km in ('2 WHEELER', '4 WHEELER')条件推入case表达式,但是每次对每行都必须运行查询,并且如果大多数情况下可能会降低性能行被插入不是2或4轮车