首页 文章

Oracle SQL创建触发器以增加每行的序列号

提问于
浏览
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;

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

相关问题