1

この制約に必要なトリガーのタイプにこだわっています。

代金と手数料を頂きます。価格によってコミッション額が決まります。< 100 - 4%、< 200 - 5% など。

私の考え。データベースには、101、201、401、601 の 4 つの価格値を保持する別のテーブルが含まれており、それぞれに一致するコミッション % があり、これは PC と呼ばれます。物件リストを作成するときに、入力した価格に応じて得られる手数料を計算したいと考えています。

挿入時に、new.price をチェックして PC の価格と比較する必要があります。new.price が price tuple 未満になったら、価格をそのコミッション値に設定します

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 に答える