0

トリガーを作成しようとしていますが、最初の試行のように設計できないことがわかりました。これを以下に示します。これにより、テーブルが変更されているときにテーブルから選択するため、「変更テーブル」エラーが発生します。一度に 1 つのレコードのみを挿入する場合、実際にはこのエラーは発生しませんでしたが、一度に複数のレコードを挿入すると発生します。

トリガーの目的は、顧客が挿入されようとしている顧客と等しいテーブル内のレコードの数をカウントし、新しい order_num 値を count+1 として設定することです。また、シーケンスから引き出されるトリガーによって設定された公開鍵の値もあります。この部分は、トリガーの order_num 部分と関連する SELECT を削除すると正常に機能します。ここでやろうとしていることをどのように達成できますか? 前もって感謝します。

CREATE OR REPLACE TRIGGER t_trg
    BEFORE INSERT ON t
    FOR EACH ROW
DECLARE
    rec_count NUMBER(2,0);
   BEGIN
     SELECT COUNT(*) INTO rec_count
     FROM t
     WHERE customer_id = :NEW.customer_id;

     :NEW.order_num:= rec_count+1;
     :NEW.order_pk_id:= table_seq.NEXTVAL;

   END;
4

1 に答える 1

0

2 つのトリガーと一時テーブルのアプローチにより、テーブルの変更エラーを防止して、求めるソリューションを提供できます。ただし、パフォーマンスが低下する可能性が高くなります。

create global temporary table cust_temp(customer_id number, cust_cnt number);

create or replace trigger t_trig1
before insert on t
declare
begin
  insert into cust_temp select customer_id, count(*) from t group by customer_id;
end;
/

CREATE OR REPLACE TRIGGER t_trg2 
    BEFORE INSERT ON t
    FOR EACH ROW
DECLARE
    rec_count number;
   BEGIN
     BEGIN
       SELECT cust_cnt INTO rec_count
       FROM cust_temp
       WHERE customer_id = :NEW.customer_id;
    EXCEPTION when no_data_found then rec_count := 0;
    END;
     :NEW.order_num:= rec_count+1;
     :NEW.order_pk_id:= table_seq.NEXTVAL;
      update cust_temp set cust_cnt = rec_count + 1 
      where customer_id = :NEW.customer_id;

   END;
  /
于 2016-01-25T17:03:20.497 に答える