PLSQL-在触发器中插入Iinsert导致递归循环 [英] PLSQL - Iinsert in trigger causing recursive loop

查看:91
本文介绍了PLSQL-在触发器中插入Iinsert导致递归循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个触发器,在插入到关键字表中时会运行.关键字以字符串形式输入,并用逗号分隔.我已经分离了每个值,然后尝试将它们插入每个值到表中.但是当我执行插入操作时,我得到一个错误.

I have a trigger which runs when on an insert in to my keyword table. The key word is taken in as a string and separated by a comma. I have separated each value and then try insert them in each value into the table. But when I run the insert I get an error.

我的触发器

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: "SW3.TRG_INSERTKEYWORDS",第4行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行以下错误 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行以下错误 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行ORA-04088:执行过程中出错 触发"SW3.TRG_INSERTKEYWORDS" ORA-06512: "SW3.TRG_INSERTKEYWORDS",第8行 00036.00000-超出了递归SQL级别的最大数量(%s)" *原因:尝试超过指定的数量 递归SQL级别. *操作:删除递归SQL,可能是递归触发器.

Error starting at line : 2 in command - INSERT INTO KEYWORD VALUES(75,'SDFSDF',1000) Error report - SQL Error: ORA-00036: maximum number of recursive SQL levels (50) exceeded ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 4 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 ORA-04088: error during execution of trigger 'SW3.TRG_INSERTKEYWORDS' ORA-06512: at "SW3.TRG_INSERTKEYWORDS", line 8 00036. 00000 - "maximum number of recursive SQL levels (%s) exceeded" *Cause: An attempt was made to go more than the specified number of recursive SQL levels. *Action: Remove the recursive SQL, possibly a recursive trigger.

推荐答案

您当前的逻辑会不断触发其中的每个INSERT触发器!

Your current logic keeps firing the trigger itself on every INSERT inside it!

因此,也许您使用VIEW寻找INSTEAD OF触发器

So, Perhaps you look for a INSTEAD OF trigger using a VIEW

create or replace TRIGGER trg_INSERTKEYWORDS
INSTEAD OF INSERT ON Keyword

就像执行我在触发逻辑中所说的一样,而不是在视图上实际插入!

It is like, instead of the actual insert on view, do what I tell in my trigger logic !

查看:

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;

这篇关于PLSQL-在触发器中插入Iinsert导致递归循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆