触发auto_increment oracle无序列

时间:2017-08-21 13:45:28

标签: oracle triggers

我创建了一个触发器来管理auto_increment,但由于我不知道它总是向我显示这个错误:超出了最大递归SQL级别数(50)。

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;

1 个答案:

答案 0 :(得分:2)

它是递归的,因为每次将记录插入PEOPLE时,你的触发器会在PEOPLE中插入另一条记录,这会导致触发器触发并将另一条记录插入PEOPLE,这样......你就明白了。

在Oracle触发器中,您只需设置:NEW值即可更改插入的内容,例如:

:NEW.matricule := 100;

但是,您的触发器仍然无效,因为它从同一个表中选择,这将导致“表正在变异”异常。

这里最好的答案是使用序列 - 它们旨在避免这些问题并提供最佳性能。但是,如果您真的需要此增量功能,请在不插入触发器之前执行此操作。