01403. 00000'未找到数据'

时间:2016-02-06 16:06:15

标签: oracle plsql database-trigger

当我想要更新或插入其zip不在zipcodes表中的行时,我发现没有找到数据'错误。我很困惑因为我已经为validzip变量分配了一个默认值67226,他们怎么能找不到数据呢?感谢。

3 个答案:

答案 0 :(得分:2)

如果SELECT ... INTO ...语句没有返回任何行,则会引发NO_DATA_FOUND异常。 INTO的目标是否先前已初始化是无关紧要的。

您需要添加一个异常处理程序来捕获NO_DATA_FOUND异常。或者,另一种方法是更改​​查询,以便始终返回一行;例如,你可以SELECT COUNT(*)返回0或1。

答案 1 :(得分:0)

我猜您的问题在:new.zip,当您插入或更新数据时,列zip是否具有值67226

 select zipcodes.zip 
      into validzip 
  from zipcodes 
  where (:new.zip=zipcodes.zip);

这个:new.zip := validzip;是什么意思?

我想下面的内容可能有用(我不确定,因为你必须指定条件,除非你指定条件,否则最好指定default值)

update zipcodes set  :new.zip=67226 where zip is null

答案 2 :(得分:0)

您的触发器需要捕获NO_DATA_FOUND异常并将默认值替换为以下值:NEW.ZIP:

create or replace trigger employees_bef_ins_upd_row
before insert or update of zip on employees
for each row
declare
  validzip employees.zip%type;
begin
  select zipcodes.zip 
      into validzip 
  from zipcodes 
  where :new.zip = zipcodes.zip;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    :NEW.ZIP := 67226;
end;

这应该可以满足你的任务,但是在The Real World(tm)中,如果你把这个设计交给我审查,我会把它扔给你,并附上一个说明"触发器中没有业务逻辑!&#34 ;.永远不应该使用As explained here触发器来强制执行业务要求 - 这是应用程序代码的用途。

祝你好运。