我在表MEM_MEMBER中建立一个触发器,因为表MEM_MEMBER 中字段太多,我要循环表MEM_MEMBER中的字段来比较new 和old值 我要循环表MEM_MEMBER中的字段,如:new.mem_member_id或者:old.mem_member_id我想把表MEM_MEMBER中的所有的字段用一个变量表示出来,如:new.v_column_name 我已经通过游标把字段名都取出来了,我要比较每个字段是否有变化,然后我再插入另一个表中,可是有问题,怎么办?
create or replace trigger TR_MEM_MEMBER_LOG
after INSERT OR UPDATE OR DELETE ON MEM_MEMBER FOR EACH ROW
declare
cursor CUR_MEM_MEMBER_LOG_DATA is
select column_name,column_id from user_tab_cols where table_name='MEM_MEMBER' order by column_id;
v_column_name user_tab_cols.column_name%type;
v_column_id user_tab_cols.column_id%type;
BEGIN
--更新时写日志
IF UPDATING THEN
OPEN CUR_MEM_MEMBER_LOG_DATA;
LOOP
FETCH CUR_MEM_MEMBER_LOG_DATA INTO v_column_name,v_column_id;
EXIT WHEN CUR_MEM_MEMBER_LOG_DATA%NOTFOUND;
--有问题
IF ':NEW.'||v_column_name <> ':OLD.'||v_column_name THEN
INSERT INTO MEM_MEMBER_LOG(MEMBER_LOG_ID,MEMBER_ID,MENMBER_FIELDS,MENMBER_COUNT,MEMBER_LOG_FLAG,OPERATION_DATE)
Values(SEQ_MEM_MEMBER_LOG.NEXTVAL,:OLD.MEMBER_ID, v_column_name,':OLD.'||v_column_name,'2',SYSDATE);
End IF ;
End loop;
close CUR_MEM_MEMBER_LOG_DATA;
End IF;
End TR_MEM_MEMBER_LOG;
CREATE TRIGGER DB2ADMIN.A AFTER INSERT ON DB2ADMIN.TESTYU1 REFERENCING NEW AS NEWROW FOR EACH ROW MODE DB2SQL
insert into DB2ADMIN.SYNC_AA(CDATE,TABLE_NAME,PRIKEY_VALUE1,PRIKEY_OLDVALUE1,ACTION_TAG,STATUS_TAG) values(current_date,'TESTYU1',NEWROW.ID,NEWROW.ID,'INSERT',0)
我现在是这样就ok了!
加上
BEGIN ATOMIC
END^
就不知道怎么解决了
我就是用在触发器里面。
手动创建就能成功。我把成功的sql语句导出来是这样的:
CONNECT TO TEST^
CREATE TRIGGER DB2ADMIN.A AFTER INSERT ON DB2ADMIN.TESTYU1 REFERENCING NEW AS NEWROW FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
insert into DB2ADMIN.SYNC_AA(CDATE,TABLE_NAME,PRIKEY_VALUE1,PRIKEY_OLDVALUE1,ACTION_TAG,STATUS_TAG) values(current_date,'TESTYU1',NEWROW.ID,NEWROW.ID,'INSERT',0);
END^
CONNECT RESET^