0

当我想更新或插入其 zip 不在 zipcodes 表中的行时,出现“未找到数据”错误。我很困惑,因为我已经为 validzip 变量分配了默认值 67226,他们怎么找不到数据?谢谢。

4

3 回答 3

2

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

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

于 2016-02-06T16:43:39.567 回答
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
于 2016-02-06T16:37:09.700 回答
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;

这应该满足你的任务,但在现实世界 (tm) 中,如果你把这个设计交给我审查,我会把它扔给你,上面写着“触发器中没有业务逻辑!”。正如这里所解释的,触发器永远不应该用于强制执行业务需求——这就是应用程序代码的用途。

祝你好运。

于 2016-02-07T02:39:06.377 回答