0

我正在尝试创建一个触发器,但我了解到我无法像第一次尝试那样设计它,如下所示。由于在修改表时从表中进行选择,这将导致“变异表”错误。一次只插入一条记录时,实际上并没有导致此错误,但是当我一次插入多条记录时,它确实会导致此错误。

触发器的目的是统计客户等于即将插入的客户的表中的记录数,并将新的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

两种触发器和临时表方法可以为您提供解决方案,防止变异表错误。但是,性能很可能会受到影响。

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 回答