当我想更新或插入其 zip 不在 zipcodes 表中的行时,出现“未找到数据”错误。我很困惑,因为我已经为 validzip 变量分配了默认值 67226,他们怎么找不到数据?谢谢。
问问题
1350 次
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 回答