具有UDT的表的Oracle V $ LOGMNR_CONTENTS-连接UPDATE和INTERNAL操作

问题描述

我正在使用UDT(用户定义类型)更新oracle表,然后查询V$LOGMNR_CONTENTS视图。我看到更新的每一行都有2条记录-UPDATE和INTERNAL。我需要弄清楚如何链接它们,因为UPDATE操作在ROW_ID中有一个临时值,而正确的值仅出现在INTERNAL操作中,而且我不确定它们的SCN编号如何关联。我正在考虑的方法是使每个DATA_OBJ#的更新队列,并将它们链接到内部FIFO。我想念些更好的东西吗?

脚本:

CREATE TYPE srulon AS OBJECT (name VARCHAR2(30),phone VARCHAR2(20) );
create table root.udt_table (myrowid rowid,myudt srulon);
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null,srulon('small','1234'));
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null,'1234'));
update root.udt_table set myrowid=rowid,myudt = srulon('smaller',rowid);
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;

查询(在START_LOGMNR之后查询最后一个日志)

select scn,SEQUENCE#,operation,sql_REDO,ROW_ID from  V$LOGMNR_CONTENTS
where session# = 6366 and not operation like '%XML%'
order by scn,SEQUENCE#;

结果:

| SCN | SEQUENCE# | OPERATION | ROW\_ID | sql\_REDO |
| :--- | :--- | :--- | :--- | :--- |
| 240676056 | 1 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676056 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT\_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAA' where a."MYROWID" IS NULL; |
| 240676057 | 5 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676058 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT\_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAB' where a."MYROWID" IS NULL; |
| 240676059 | 5 | INTERNAL | AAB1avAAAAAAwT7AAB | NULL |
| 240676069 | 1 | COMMIT | AAAAAAAAAAAAAAAAAA | commit; |

解决方法

系统更改号(SCN)是用于跟踪数据库事务活动的主要控制功能。 SCN是一个戳记,用于定义特定时间点的数据库的提交版本。每个提交的事务都会分配一个唯一的SCN。 DB借助SCN编号保留所有数据库更改的记录。 SCN是数据库更改的运行编号

要获取当前的SCN使用

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()

因此UPDATE和INTERNAL操作之间没有其他连接,事实是UPDATE SCN低于INTERNAL SCN-但没有计算或逻辑连接

,

错误是order by scn,SEQUENCE#。 删除order by子句后,每个INTERNAL语句都将遵循其对应的UPDATE。 归功于srulon。