2016-06-14 109 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輪車