我有一个触发器,在插入到我的关键字表时运行。关键字以字符串形式显示,并以逗号分隔。我已将每个值分开,然后尝试将每个值插入到表中。但是当我运行插入时出现错误。
我的触发器
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,可能是递归触发器。
答案 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变异表错误,但无论如何。基本上,不要在触发器中间插入触发器时插入表格。
分享并享受。