通过触发器是没有办法捕获PL/SQL通过DBMS_LOB包对LOB的修改,不过通过物化视图日志可以捕获这个操作。
看一个简单的例子:
SQL> CREATE TABLE T (ID NUMBER, CONTENTS CLOB);
表已创建。
SQL> ALTER TABLE T ADD PRIMARY KEY (ID);
表已更改。
SQL> INSERT INTO T VALUES (1, 'ABCD');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'EFG');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CREATE MATERIALIZED VIEW LOG ON T;
实体化视图日志已创建。
SQL> CREATE TABLE T_LOG (ID NUMBER);
表已创建。
SQL> CREATE TRIGGER T
2 BEFORE UPDATE ON T
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO T_LOG VALUES (:NEW.ID);
6 END;
7 /
触发器已创建
SQL> UPDATE T
2 SET CONTENTS = 'ABCDEFG'
3 WHERE ID = 1;
已更新 1 行。
SQL> SELECT * FROM T_LOG;
ID
----------
1
SQL> SELECT ID FROM MLOG$_T;
ID
----------
1
SQL> DECLARE
2 V_RESULT CLOB;
3 BEGIN
4 SELECT CONTENTS
5 INTO V_RESULT
6 FROM T
7 WHERE ID = 2
8 FOR UPDATE;
9 DBMS_LOB.WRITEAPPEND(V_RESULT, 5, '12345');
10 COMMIT;
11 END;
12 /
PL/SQL 过程已成功完成。
SQL> SELECT * FROM T_LOG;
ID
----------
1
SQL> SELECT ID FROM MLOG$_T;
ID
----------
1
2
可以看到,对于SQL方式更新LOB操作,可以被触发器捕获,但是通过PL/SQL调用DBMS_LOB包对LOB进行的写操作,不会被触发器捕获。
而物化视图日志会则记录所有的操作。本以为10g中,物化视图日志不会再记录PL/SQL方式的LOB修改,才使得10g的物化视图刷新的时候不在考虑LOB的因素,没想到物化视图日志仍然是记录LOB修改的,想不通Oracle为什么以及实现的功能反而去掉了。
包含LOB的物化视图快速刷新:http://yangtingkun.itpub.net/post/468/493060
包含LOB的物化视图快速刷新(二):http://yangtingkun.itpub.net/post/468/493206
包含LOB的物化视图快速刷新(三):http://yangtingkun.itpub.net/post/468/493660
包含LOB的物化视图快速刷新(四):http://yangtingkun.itpub.net/post/468/493970
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-666540/ ,如需转载,请注明出处,否则将追究法律责任。