2016-06-14 16 views
0

私はcaseステートメント付きのトリガーを持っています。 ELSEブロックのコードの最後のセクションでは、前のCASEステートメントで値が一致しない場合、トリガーは何もしないで終了します。私はこれを行うにはどうすればよい:何もしないCASEステートメント

、本質的にselect文と同じ種類のたびに繰り返しひどく複雑な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

そこに他の人を入れる?私はAPEXアプリケーションを使って録音挿入したいとき – Chris

+0

は私疲れit..butそれは次のエラーを与える:1つのエラーが ORA-06592が発生しました:CASE文ORA-06512の実行中にCASE見つかりません:「BABBLER_GROUP.CONVEYANCE_REQUEST_T3」で、行3 ORA-04088:トリガーの実行中にエラー 'BABBLER_GROUP.CONVEYANCE_REQUEST_T3' – Teju

+3

多分 '他のヌル;'? –

答えて

2

各ステートメントの唯一の違いは、乗数が1または2で、あなただけのようにのようなケース式にSQL文を含む1つのcase文で全体を書き換える可能性があるかどうかであるので:

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')条件をプッシュする必要があると思いますが、でも(アウターケース文を持っていないと逃げることができたが、その後のクエリは、行ごとのたびに実行しなければならないであろうと、あなたのほとんどの場合には、パフォーマンスが低下する可能性があります挿入されている行は2輪または4輪ではありません。

関連する問題