1

我被困在这种约束所需的触发器类型上。

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

1 回答 1

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

我还没有测试过语法错误的触发代码,请在你端测试。

于 2012-07-04T03:39:28.320 回答