表A(column1,column2.column3)、LOG(列名,变更前,变更后)
现在给表A建立一个update的触发器。
更新A表中3个字段时,分别向LOG表插入数据。
例:更新A三个字段数据都发生变化,那么向LOG中插入3条数据。
现在代码:
create or replace
TRIGGER trigger_a
BEFORE UPDATE
ON A
FOR EACH ROW
BEGIN
IF :new.column1 != :old.column1 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column1,变更前值,变更后值);
END IF;
IF :new.column2 != :old.column2 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column2,变更前值,变更后值);
END IF;
IF :new.column3 != :old.column3 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column3,变更前值,变更后值);
END IF;EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);END;问题:现在的这样是可以实现的,但是想根据列名动态的实现这个功能,不写这么多重复的代码,可以实现吗?求指教~~oracleeach触发器
现在给表A建立一个update的触发器。
更新A表中3个字段时,分别向LOG表插入数据。
例:更新A三个字段数据都发生变化,那么向LOG中插入3条数据。
现在代码:
create or replace
TRIGGER trigger_a
BEFORE UPDATE
ON A
FOR EACH ROW
BEGIN
IF :new.column1 != :old.column1 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column1,变更前值,变更后值);
END IF;
IF :new.column2 != :old.column2 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column2,变更前值,变更后值);
END IF;
IF :new.column3 != :old.column3 THEN
INSERT INTO LOG(列名,变更前,变更后)
VALUES (column3,变更前值,变更后值);
END IF;EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);END;问题:现在的这样是可以实现的,但是想根据列名动态的实现这个功能,不写这么多重复的代码,可以实现吗?求指教~~oracleeach触发器
解决方案 »
- ORA-01033: ORACLE initialization or shutdown in progress
- 为一个表建立主键是否会影响到其他表
- 创建新用户问题
- sortorder和rownum同时使用的问题
- 小弟最近碰到了一个很奇怪的问题.连接oracle后,空闲时间超过5~10分钟,就必须重新连接一次,急在线等待.
- 如何建自动排序的ID?求SQL语句一条!
- RedHat 8 下 Oracle9、Tomcat4.1.29、Ftp的安装及配置方法
- 菜鸟问题
- 安装oracle9i时的问题,在线等
- 数据库的导入问题-----解决绝对给分!
- Date类型,神一般的现象,高手在哪里?
- linux下安装oracle出现如下问题
格式是create or replace
TRIGGER trigger_a
AFTER UPDATE of column
ON A
FOR EACH ROW
嗯。触发器创建在列上后,但是最后更新T_LOG表时候还需要通过new.列名取出值来不是嘛?
可以吗?能具体说一下吗?
你指的是先把SQL拼写出来然后再EXECUTE IMMEDIATE 执行吗?
这个方案报错:ORA-01008
delete from log t where t.变更前=t.变更后;
commit;