早教吧 育儿知识 作业答案 考试题库 百科 知识分享

oracle怎么获取更新前的值要做一个触发器,记录商品价格变化情况.item表(商品信息),和记录变化情况的pricechangecreateorreplacetriggerupdpriceafterupdateofpriceonitemforeachrowdeclare--localvariable

题目详情
oracle怎么获取更新前的值 要做一个触发器,记录商品价格变化情况.
item表(商品信息),和记录变化情况的price_change
create or replace trigger upd_price
after update of price on item
for each row
declare
-- local variables here
begin
for rec in(select itemNo,price from item where itemNo = :new.itemNo)
loop
insert into price_change(rec.itemNo,:old.price,:new.price,sysdate())
end loop;
end upd_price;
▼优质解答
答案和解析
我猜你是遇到了表发生变化,触发器不能读的错误,原因是UPDATE和触发器处于同一事务中,此时UPDATE事务未结束,所以SELECT语句报错.解决办法就是去掉这一行!然后在INSERT这行里用:new.itemNo来代替rec.itemNo.另外,你这个是行级触发器,不需要loop(itemNo想必是表item的主键吧,即使用loop,因为where的条件限制,也只会返回一行).
所以实际你只需要这么写:
create or replace trigger upd_price
after update of price on item
for each row
declare
-- local variables here
begin
insert into price_change(itemNo,oldPrice,newPrice,changeTime) values(:new.itemNo,:old.price,:new.price,sysdate);
end upd_price;
/