PLSQL 触发器 ORA 01403 未找到数据

Posted

技术标签:

【中文标题】PLSQL 触发器 ORA 01403 未找到数据【英文标题】:PLSQL Trigger ORA 01403 no data found 【发布时间】:2013-11-23 07:59:47 【问题描述】:

我正在 PL-SQL 中创建触发器以限制部门/部门中的员工 在我的员工登记表上,我得到 ORA-01403: no data found 。 请任何人帮助我

create or replace trigger DEPT_STRENTH
  after insert on empmasterinfo
  for each row
DECLARE
  -- local variables here
  EMP_Count        NUMBER;
  MAX_Strength     NUMBER;
  V_Mainid         VARCHAR2(100);
  V_orgelementname VARCHAR2(100);
BEGIN

--taking value from form

 V_Mainid         := :new.mainid;
  V_orgelementname := :new.orgelementname;

--Comparing values with existing 

  select d.strength
    into MAX_Strength
    from dept_strength d 

-- Master table 


 where d.Mainid = V_Mainid
     and d.orgelementname = V_orgelementname;

  select count(e.employeeid)
    into EMP_Count

-- Master table 


 from empmasterinfo e 
   where e.emp_status = 0
     and e.Mainid = V_Mainid
     and e.orgelementname = V_orgelementname;

  if EMP_Count >= MAX_Strength then

    RAISE_APPLICATION_ERROR(-20101,
                            'Maximum Number of Employees in Department Reached');

  end if;

end DEPT_STRENTH;

【问题讨论】:

您何时收到此消息?触发器何时触发?更重要的是,您是否在网络上进行过任何研究?只需使用谷歌搜索 ORA-01403 即可返回许多有用的信息。 是的,我做了谷歌但仍然没有得到想要的结果。在插入表之前触发触发。当有人在表中输入新条目时 【参考方案1】:

这是一个调试代码的练习。

第一步是看看你写了什么。 NO_DATA_FOUND 异常由不返回行的查询引发。您的触发器中有两个查询。但是聚合查询不会引发该异常,因为计数将返回 0。

所以只有一个查询可以抛出 ORA-01403,这清楚地表明您在 dept_strength 中没有任何行与您在 empmasterinfo 中插入的行匹配。大概您认为该表中应该有行,在这种情况下,您需要重新访问您的事务逻辑。

无论如何您都应该这样做,因为试图在触发器中强制执行这种业务规则是一个严重的错误。它无法扩展,也无法在多用户环境中工作。

【讨论】:

由于触发器是empmasterinfo 上的行级触发器,我猜这与未找到预期数据有关。一旦当前问题得到解决,下一个问题将是触发器为什么会引发变异触发器错误。 @JustinCave - 正是如此。

以上是关于PLSQL 触发器 ORA 01403 未找到数据的主要内容,如果未能解决你的问题,请参考以下文章

触发错误:ORA-01403 插入时找不到数据

ORA-01403:未找到数据 ORA-06512:在第 8 行 01403。00000 -“未找到数据”

PLSQL 未找到数据

ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好

编译 PLSQL 函数时出现“未找到数据”错误

01403. 00000 - “未找到数据”