触发器问题

JobyGuo 2010-05-09 03:38:18
写了一个触发器如下:
create sequence lt_seq;

create or replace trigger TR_ExceedingLimitNotice
before insert or update of ExpAmt
on ExpenseItem
for each row
declare
var_ECLimit number;
var_ecno number;
begin

select ecno
into var_ecno
from ExpenseItem
where eino=:new.eino;

select ECLimit
into var_ECLimit
from ExpCat
where ecno=var_ecno;

if :new.expamt>var_ECLimit then
insert into Log_Table
values(lt_seq.nextval,'TR_ExceedingLimitNotice','ExpenseItem',:new.eino,sysdate,'expense limit!');
end if;

end;


--测试:
insert into expenseitem(EINO,EXPDESC,EXPENSEDATE,EXPAMT,EXPAPPRAMT,ERNO,ECNO)
values(ei_seq.nextval,'Car Rental','2007-7-10',99,40,1,1);

测试的结果老是出现错误
insert into expenseitem(EINO,EXPDESC,EXPENSEDATE,EXPAMT,EXPAPPRAMT,ERNO,ECNO)
*
第 1 行出现错误:
ORA-01403: 未找到数据
ORA-06512: 在 "ERDB.TR_EXCEEDINGLIMITNOTICE", line 6
ORA-04088: 触发器 'ERDB.TR_EXCEEDINGLIMITNOTICE' 执行过程中出错


那位大侠帮忙看一下是怎么回事,多谢了
...全文
98 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuelianlee 2010-05-10
  • 打赏
  • 举报
回复
直接是:new.pk_id
JobyGuo 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 adebayor 的回复:]
引用 7 楼 sdnubaoyu 的回复:

还想问你一个问题,更新了一个字段,那怎么得到被更新的这一行的主键值呢?

你对某条数据进行更新 首先就是根据它的主键来定位这条数据的
显然更新后 主键对你来说是已知的
[/Quote]
就是在触发器里面呀,主键怎么获得?对我来说是已知的,但是在触发器里面怎么表示呢?
Adebayor 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sdnubaoyu 的回复:]

还想问你一个问题,更新了一个字段,那怎么得到被更新的这一行的主键值呢?
[/Quote]
你对某条数据进行更新 首先就是根据它的主键来定位这条数据的
显然更新后 主键对你来说是已知的
Adebayor 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sdnubaoyu 的回复:]

还想问你一个问题,更新了一个字段,那怎么得到被更新的这一行的主键值呢?
[/Quote]
在触发器里面吗?
JobyGuo 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 adebayor 的回复:]
在触发器后面加上异常处理
exception
when no_data_found then
dbms_output.put_line('no_data_found');
end;
你就能看出来了
[/Quote]

还想问你一个问题,更新了一个字段,那怎么得到被更新的这一行的主键值呢?
Adebayor 2010-05-09
  • 打赏
  • 举报
回复
在触发器后面加上异常处理
exception
when no_data_found then
dbms_output.put_line('no_data_found');
end;
你就能看出来了
codearts 2010-05-09
  • 打赏
  • 举报
回复

begin
select ecno
into var_ecno
from ExpenseItem
where eino=:new.eino;
exception
when no_data_found then
null; ---这里,捕获异常并处理
end;

codearts 2010-05-09
  • 打赏
  • 举报
回复
select ecno
into var_ecno ---这里,假如一条记录也没有,会抛出no_data_found异常
from ExpenseItem
where eino=:new.eino;

select ECLimit
into var_ECLimit ---这里,假如一条记录也没有,会抛出no_data_found异常
from ExpCat
where ecno=var_ecno;
JobyGuo 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 adebayor 的回复:]
引用楼主 sdnubaoyu 的回复:
select ecno
into var_ecno
from ExpenseItem
where eino=:new.eino;

select ECLimit
into var_ECLimit
from ExpCat
where ecno=var_ecno;

这两句出问题
select into时 没有数据 抛异常了
[/Quote]

可是看不出哪个地方出错了啊,
测试就是在ExpCat表中找ecno=1的那一列,这一列是存在的,怎么会没有数据呢?
Adebayor 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 sdnubaoyu 的回复:]
select ecno
into var_ecno
from ExpenseItem
where eino=:new.eino;

select ECLimit
into var_ECLimit
from ExpCat
where ecno=var_ecno;
[/Quote]
这两句出问题
select into时 没有数据 抛异常了

JobyGuo 2010-05-09
  • 打赏
  • 举报
回复
怎么没有人回答呀?哪位大哥帮忙给解决一下

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧