sql Trigger需要从值设置x

时间:2012-07-04 02:56:06

标签: sql oracle triggers oracle-apex

我遇到了这种约束所需的触发类型。

我会有价格和佣金。价格决定佣金金额,< 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;

1 个答案:

答案 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;
/

我没有测试语法错误的触发器代码,请在最后测试。