PL SQL - 插入触发器导致递归循环

时间:2014-11-10 19:49:19

标签: oracle plsql insert triggers

我有一个触发器,在插入到我的关键字表时运行。关键字以字符串形式显示,并以逗号分隔。我已将每个值分开,然后尝试将每个值插入到表中。但是当我运行插入时出现错误。

我的触发器

create or replace TRIGGER trg_INSERTKEYWORDS
BEFORE INSERT ON Keyword
FOR EACH ROW
DECLARE
varKeyWordsStr VARCHAR2 (255) := 'Hello,How,are,you,keeping';
BEGIN
FOR k IN (SELECT REGEXP_SUBSTR (varKeyWordsStr,'[^,]+',1,LEVEL) keyWord
           FROM DUAL
           CONNECT BY REGEXP_SUBSTR (varKeyWordsStr,'[^,]+',1,LEVEL)IS NOT NULL)
LOOP
  INSERT INTO KEYWORD VALUES(seqKeyWord.NEXTVAL,k.keyWord,1000);
END LOOP;
END;

但我得到了错误

  

在命令行中从第2行开始出错 - INSERT INTO KEYWORD   VALUES(75,'SDFSDF',1000)错误报告 - SQL错误:ORA-00036:最大值   递归SQL级别数(50)超过ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第4行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行ORA-04088:执行期间出错   触发'SW3.TRG_INSERTKEYWORDS'ORA-06512:at   “SW3.TRG_INSERTKEYWORDS”,第8行   00036. 00000 - “超出最大递归SQL级别数(%s)”   *原因:试图超过指定的数量              递归SQL级别。   *动作:删除递归SQL,可能是递归触发器。

2 个答案:

答案 0 :(得分:2)

您当前的逻辑会在其内部的每个INSERT中继续触发触发器!

所以,也许您使用VIEW寻找INSTEAD OF触发器

create or replace TRIGGER trg_INSERTKEYWORDS
INSTEAD OF INSERT ON Keyword

就像在视图中的实际插入一样,执行我在触发逻辑中所做的事情!

查看:

CREATE VIEW MYVIEW AS 
SELECT
  LISTAGG(keyword,',') WITHIN GROUP (ORDER BY seq) as keyword,
  some_code
 FROM  Keyword
GROUP BY some_code;

触发器:

create or replace TRIGGER trg_INSERTKEYWORDS
INSTEAD OF INSERT ON MYVIEW 
FOR EACH ROW
DECLARE
varKeyWordsStr VARCHAR2 (255) := 'Hello,How,are,you,keeping';
/* Isn't it keyWord from the inserted value ?? */
BEGIN
  FOR k IN (SELECT REGEXP_SUBSTR (varKeyWordsStr,'[^,]+',1,LEVEL) keyWord
             FROM DUAL
            CONNECT BY REGEXP_SUBSTR (varKeyWordsStr,'[^,]+',1,LEVEL)IS NOT NULL)
  LOOP
      INSERT INTO KEYWORD VALUES(seqKeyWord.NEXTVAL,k.keyWord,1000);
  END LOOP;
END;

答案 1 :(得分:1)

在插入KEYWORD的触发器期间,此触发器将插入KEYWORD表。触发器中的每个INSERT都会再次触发触发器,然后再次尝试执行所有INSERT,重新触发触发器等等。坦率地说,我很惊讶你没有得到一个ORA-04091变异表错误,但无论如何。基本上,不要在触发器中间插入触发器时插入表格。

分享并享受。