Ora 01403尝试将数据插入oracle表时
我有下面的触发器Ora 01403尝试将数据插入oracle表时,oracle,plsql,Oracle,Plsql,我有下面的触发器 CREATE OR REPLACE TRIGGER L_BIUR_G_LAY BEFORE INSERT OR UPDATE ON G_LAY FOR EACH ROW When (new.g_roo is not null) DECLARE x number(1); stmt varchar(255); BEGIN
CREATE OR REPLACE TRIGGER L_BIUR_G_LAY
BEFORE INSERT OR UPDATE ON G_LAY
FOR EACH ROW
When (new.g_roo is not null)
DECLARE
x number(1);
stmt varchar(255);
BEGIN
FOR I IN (SELECT DISTINCT G_TAB FROM G_LEG)
LOOP
stmt := 'select distinct g_lind from ' || i.g_tab || ' where g_roo = ' || :new.g_roo;
Execute immediate stmt into x;
IF (x<>0) THEN
RAISE_APPLICATION_ERROR(-2001, 'G_ROO cannot be inserted where G_LIND IS NOT ZERO');
END IF;
END LOOP;
END;
/
我得到以下错误
错误报告:
SQL错误:ORA-01403:未找到任何数据
ORA-06512:在L_BIUR_G_LAY,10号线
ORA-04088:执行触发器“G_-LAY”时出错
140300000-未找到任何数据
任何帮助都将不胜感激。在我的触发器中声明后,它尝试了PRAGMA autonomy_事务,但对我没有帮助问题不在于INSERT语句。执行触发器中动态构建的SELECT语句时会出现问题-未找到数据,因此引发ORA-01403。在我看来,最简单的方法是选择计数…:
CREATE OR REPLACE TRIGGER L_BIUR_G_LAY
BEFORE INSERT OR UPDATE ON G_LAY
FOR EACH ROW
When (new.g_rowno is not null)
DECLARE
x number;
stmt varchar(255);
BEGIN
FOR I IN (SELECT DISTINCT G_DISPCNTRLTAB FROM G_LEG) LOOP
stmt := 'select COUNT(*) from ' || i.g_dispcntrltab ||
' where g_rowno = ' || :new.g_rowno ||
' and g_lind <> 0';
Execute immediate stmt into x;
IF x <> 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'G_RWNO cannot be inserted where G_LIND IS NOT ZERO');
END IF;
END LOOP;
END L_BIUR_G_LAY;
我还更改了错误号,因为-2001不在使用RAISE_应用程序_error可以引发的错误范围内。有效范围为-20000到-20999
分享和享受。作为plsql世界的新手,我认为这是一个有效的例外,因为我没有处理插入或更新之前未找到的数据,但后来我更改了代码,而不是Bob的代码,并在插入之后进行了修改,即使我遇到了同样的问题,我惊讶地看到了相同的错误消息。然而,我有一种印象,如果我将触发器从插入前更改为插入后未发现数据错误,因为插入后触发器将在插入发生后运行,但在数据在G_LAY表中可见之前运行,但出乎意料的是,它没有发生。不知道为什么。
CREATE OR REPLACE TRIGGER L_BIUR_G_LAY
BEFORE INSERT OR UPDATE ON G_LAY
FOR EACH ROW
When (new.g_rowno is not null)
DECLARE
x number;
stmt varchar(255);
BEGIN
FOR I IN (SELECT DISTINCT G_DISPCNTRLTAB FROM G_LEG) LOOP
stmt := 'select COUNT(*) from ' || i.g_dispcntrltab ||
' where g_rowno = ' || :new.g_rowno ||
' and g_lind <> 0';
Execute immediate stmt into x;
IF x <> 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'G_RWNO cannot be inserted where G_LIND IS NOT ZERO');
END IF;
END LOOP;
END L_BIUR_G_LAY;