我有一个带有 case 语句的触发器。在 ELSE 块中代码的最后一部分中,我希望触发器不执行任何操作并在前面的 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;
这是一个非常复杂的 case 语句,每次都重复本质上相同类型的 select 语句。
由于每个语句之间的唯一区别是乘数是 1 还是 2,因此您可以在一个包含带有 case 表达式的 sql 语句的 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')
条件推入 case 表达式中,但是每次都必须为每一行运行查询,这可能会降低性能如果插入的大部分行不是 2 轮或 4 轮车。
If you want to just pass and do nothing with case statement in sql do this ;
选择
案件
当 ss.ssal < fs.fsal then ss.sname
别的 ''
结尾
来自SS
--> 输入一个空引号,这样它就不会重新调整任何内容。