0

我正在使用 UDT(用户定义类型)更新 oracle 表,然后查询V$LOGMNR_CONTENTS视图。我看到更新的每一行都有 2 条记录 - UPDATE 和 INTERNAL。我需要弄清楚如何在它们之间进行链接,因为 UPDATE 操作中有一个临时值,ROW_ID并且正确的值只出现在 INTERNAL 操作中,而且我不确定它们的 SCN 编号如何相关。我正在考虑的方式是为每个 UPDATEs 创建一个队列DATA_OBJ#,并将它们链接到 INTERNALs 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, srulon('small', '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; |
4

2 回答 2

0

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

获取当前 SCN 使用

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()

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

于 2020-11-02T00:30:15.320 回答
0

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

于 2020-11-03T07:56:02.173 回答