2017-08-21 101 views
-1

我創建了一個觸發器來管理auto_increment,但因爲我不知道它總是向我顯示這個錯誤:超過遞歸SQL級別(50)的最大數量。觸發auto_increment甲骨文沒有序列

CREATE OR REPLACE TRIGGER auto_increment BEFORE INSERT ON people FOR EACH ROW 

DECLARE 
    mat number;    
    namm varchar(40);    
    coun number; 

BEGIN   
    namm:=:new.name;  

    IF inserting() THEN T 
     SELECT COUNT(*) INTO coun FROM people; 

     IF coun = 0 THEN         
      INSERT INTO people VALUES(100,namm); 
     ELSE 
      SELECT MAX(:old.matricule+1) INTO mat FROM people; 
      INSERT INTO people (matricule,name) VALUES(mat,namm); 
     END IF;      
    END IF;  

END;

回答

2

它是遞歸的,因爲每次將一條記錄插入到PEOPLE中時,觸發器會將另一條記錄插入到PEOPLE中,這會導致觸發器觸發並將另一條記錄插入到PEOPLE中,這......您明白了。

在Oracle觸發器你剛纔設置的:新的價值觀改變的是什麼插入例如:

:NEW.matricule := 100; 

但是,你的觸發仍然是行不通的,因爲它從同一個表中選擇,這將導致「表正在變異」異常。

真的,這裏最好的答案是使用一個序列 - 它們旨在避免這些問題以及提供最佳性能。但是如果你真的需要這個增量功能,那麼在插入之前不要觸發。