当我想要更新或插入其zip不在zipcodes表中的行时,我发现没有找到数据'错误。我很困惑因为我已经为validzip变量分配了一个默认值67226,他们怎么能找不到数据呢?感谢。
答案 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触发器来强制执行业务要求 - 这是应用程序代码的用途。
祝你好运。