2012-07-04 49 views
1

我被困在這個約束所需的觸發器類型。sql觸發器需要從一個值中設置x

我會有一個價格和佣金。價格決定佣金金額,< 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

陳述您正在使用的RDBMS(例如Postgresql,MySQL,Sql Server等)。每個RDBMS具有不同的觸發語法和機制 –

+0

我使用的是oracle應用程序express – George

回答

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

我還沒有測試觸發代碼的語法錯誤,請在您的端測試。

相關問題