new and old

show214 2010-05-14 09:30:34
请问触发器里的old和new 有什么区别?
...全文
141 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
da21 2010-05-14
  • 打赏
  • 举报
回复
2楼正解
心中的彩虹 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 show214 的回复:]
请问触发器里的old和new 有什么区别?
[/Quote]

:new.col 中的就是当插入或者更新对象的未来数据(新数据)

:old.col 中的就是 当删除对象时,对象中的老数据
zjwssg 2010-05-14
  • 打赏
  • 举报
回复
网上搜的,概念性的东西,网上太多了,看两个页面就清楚了。
qin_phoenix 2010-05-14
  • 打赏
  • 举报
回复
insert 触发器只有new引用,指向新插入的数据。
update包含这两个引用,分别指更新前后的数据。
delete只有old引用,指向删除前的数据。
zjwssg 2010-05-14
  • 打赏
  • 举报
回复
ORACLE触发器和new、old特殊变量

:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

系统中的触发器实例:

create or replace trigger JBPM.TIB_DEPLOYBYMOVEPAPER before //before表示在操作完成前触发, after表示在完成后触发

insert //发生插入数据操作触发
on JBPM.DEPLOYBYMOVEPAPER for each row //指定触发器每行触发一次
declare
integrity_error exception; //用户自定义错误
errno integer;
errmsg char(200);
dummy integer;
found boolean;
row_count number;
max_num deploybymovepaper.num%type; //根据表的字段定义变量类型
zero_today deploybymovepaper.num%type;

begin
-- Column "ID" uses sequence SEQUENCE_38
case
when inserting then //SQL语句只能使用:new特殊变量
select SEQUENCE_38.NEXTVAL INTO :new.ID from dual;// 主键自增
zero_today :='0391'||to_char(sysdate,'yymmdd')||lpad(to_char(0),4,'0');//lpad函数定义字符串长度 为4不足时用0补全
select count(*) into row_count from deploybymovepaper;
if row_count = 0 then
max_num:=zero_today;//:=给变量赋值
else
select max(num) into max_num from deploybymovepaper;
end if;
if max_num<zero_today then
max_num:=zero_today;
end if;
if :new.num is null then
:new.num:=lpad(to_char(to_number(max_num)+1),14,'0'); //递增编号,有14为数字组成
end if;
when updating('num') then//:new、:old都可以用
if :new.num!=:old.num then
:new.num:=:old.num;
end if;
end case;

-- Errors handling
exception
when integrity_error then
raise_application_error(errno, errmsg); // 抛出异常语句
end;
/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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