我遇到了这种约束所需的触发类型。
我会有价格和佣金。价格决定佣金金额,< 100-4%,< 200 - 5%等。
我的想法。 数据库包含一个单独的表,它将包含4个价格值101,201,401,601,以及它们自己的匹配委托%,这将被称为PC。当我创建房产列表时,我想根据输入的价格计算他们赚取的佣金。
在插入时,我需要检查new.price并将其与PC中的价格进行比较。一旦new.price低于价格元组,我就将价格设定为佣金值
create or replace TRIGGER findCommission BEFORE INSERT OR UPDATE ON HASLISTING
FOR each ROW
BEGIN
IF (:NEW.ASKING_PRICE < 100001) THEN
:NEW.COMMISSION = 6.0;
END IF;
IF (:NEW.ASKING_PRICE < 250001) THEN
:NEW.COMMISSION = 5.5;
END IF;
IF (:NEW.ASKING_PRICE < 1000001) THEN
:NEW.COMMISSION = 5.0;
END IF;
IF (:NEW.ASKING_PRICE > 1000000) THEN
:NEW.COMMISSION = 4.0;
END IF;
END;
答案 0 :(得分:3)
我建议使用一个函数进行这样的计算,然后在触发器中调用它。这样,佣金逻辑保持独立并且可以改变。
此外,您的佣金表说明可能有所帮助。
create table price_comm(
max_price number(20),
comm number(5,2)
);
insert into price_comm (max_price, comm) values (10000, 2.0);
insert into price_comm (max_price, comm) values (20000, 3.0);
insert into price_comm (max_price, comm) values (30000, 4.0);
commit;
create or replace function f_get_comm_percent(
i_price in number
) return number
as
o_comm_percent price_comm.comm%type;
begin
select comm
into o_comm_percent
from (
select comm,
rank () over (order by max_price desc) rnk
from price_comm
where max_price <= i_price
) where rnk = 1;
return o_comm_percent;
end;
/
- 这也假设范围不重叠,如果相同,则获得最大的委托;)
现在获得佣金价值......
SQL> select f_get_comm_percent(12000) from dual;
F_GET_COMM_PERCENT(12000)
-------------------------
2
SQL> select f_get_comm_percent(45000) from dual;
F_GET_COMM_PERCENT(45000)
-------------------------
4
- 您的触发器定义可能就像这样简单。看看你的问题,似乎你在表格中有百分比,你需要在决赛桌上的佣金值。
create or replace trigger trg_biu_haslisting
before insert or update of haslisting
for each row
referencing new as new and old as old
begin
:NEW.commission := :NEW.price*f_get_comm_percent(:NEW.price);
--any other columns that you need to set
end;
/
我没有测试语法错误的触发器代码,请在最后测试。