Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ora 01403尝试将数据插入oracle表时_Oracle_Plsql - Fatal编程技术网

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;