我先把我懂的说出来。
更新check_da的ztdm列之前做如下操作
when里面的OLD和NEW不知道是什么意思,OLD是指更新前的ZTBZ列,NEW是指更新后的ZTBZ列是吗?
定义三个变量
获取一个当前的日期给curr_date,dual是否是个临时表?
获取下一个序列给curr_dm
date不为空就把date给id,否则把dm给id
最后一句insert语句,里面的new是指什么
create or replace trigger TRI_CHECK_DA
  before update OF ZTDM ON check_da  
  for each row
  
when (OLD.ZTDM <> NEW.ZTDM)
declare
  CURR_DATE       VARCHAR2(8)  := NULL;
  CURR_DM         VARCHAR2(8)  := NULL;
  CURR_ID         VARCHAR2(16)  := NULL;
begin
  select TO_CHAR(sysdate,'yyyymmdd') into CURR_DATE from dual ;
select TO_CHAR(qt_seq.nextval) into CURR_DM from dual ;
CURR_ID:=CURR_DATE || CURR_DM;
insert into CHECK_DA_LSJL
VALUES (
CURR_ID,
:new.SLDH,
:new.HTZH,
:new.FLH,
:new.WJS,
:new.ZYS,
:new.CZRY,
:new.CZRQ,
:new.LRRY,
:new.LRRQ,
:new.ZTDM,
:new.YHBH,
:new.CZRYLX,
:new.MLH,
:new.LJDW,
:new.AZD
);
END;

解决方案 »

  1.   


    /*
    一个before触发器
    更新check_da表的ztdm列
    条件:OLD.ZTDM <> NEW.ZTDM,也就是ztdm值改变
    CURR_ID这个值是将系统时间转为字符串连接到序列的值(也是字符串)
    最后将他们添加到一个表中CHECK_DA_LSJL
    注意:
    when (OLD.ZTDM <> NEW.ZTDM)条件里面不能引用:OLD.ZTDM或者:NEW.ZTDM
    而在下面的begin end主体部分,不能使用new,old引用值
    序列首次引用必须:sequence.nextval
    */
      

  2.   

    when里面的OLD和NEW不知道是什么意思,OLD是指更新前的ZTBZ列,NEW是指更新后的ZTBZ列是吗?
    正是dual是否是个临时表?
    dual是一个系统预定义的一个表,它只有一列DUMMY,就当它是一个普通表。
    也可改为:CURR_DATE := TO_CHAR(SYSDATE, 'yyyymmdd');最后一句insert语句,里面的new是指什么
    引发触发器时表check_da各字段的新值