请问db2类似oracle中new和old功能如何获取,谢谢各位!

zrqlb 2009-11-12 03:01:51
db2需要表示某个字段更新前和更新后的值。
如获取oracle中表table的NAME字段的现在值和以前值表示“INSERT INTO table(VALUE1, OLDVALUE1)values(:NEW.NAME,:OLD.NAME)”。db2中该怎么写呢?
网上没有找到相关资料,多谢高手帮帮忙!
...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshihai_2006 2011-09-07
  • 打赏
  • 举报
回复
我在表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;
zrqlb 2009-11-18
  • 打赏
  • 举报
回复
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^
就不知道怎么解决了
zrqlb 2009-11-16
  • 打赏
  • 举报
回复
我就是用在触发器里面。
手动创建就能成功。我把成功的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^

为什么我执行SQl语句就报错呢?
yangxiao_jiang 2009-11-12
  • 打赏
  • 举报
回复
你创建触发器的时候,不是有old as oldrow这样的话吗?
oldrow就是你要的,你如果没有动,那么old就应该是默认的,和oracle一样用。

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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