因此,这基本上是关于查找重复记录的后续问题.
我们每天从文本文件执行数据导入,最后我们导入了两次分布在182个文件中的10163条记录.在运行上述查询以查找重复项时,我们获得的记录总数为10174,比文件中包含的记录多11个记录.我假设2个记录的可能性完全相同,并且在查询中也考虑了有效记录.所以我认为最好使用时间戳字段并简单地找到今天运行的所有记录(因此最终添加了重复的行).我使用ORA_ROWSCN使用以下查询:
select count(*) from my_table
where TRUNC(SCN_TO_TIMESTAMP(ORA_ROWSCN)) = '01-MAR-2012'
;
Run Code Online (Sandbox Code Playgroud)
但是,计数仍然更多,即10168.现在,我很确定通过在包含所有文件的文件夹中运行以下命令,文件中的总行数为10163.wc -l *.txt.
是否有可能找出实际插入两次的行?
Jus*_*ave 14
默认情况下,ORA_ROWSCN存储在块级别,而不是行级别.如果表最初是在ROWDEPENDENCIES启用时构建的,则它仅存储在行级别.假设您可以在一个块中放置表的多行,并且您没有使用APPEND提示将新数据插入到表的现有高位标记之上,那么您可能会将新数据插入到已经存在某些块的块中其中的现有数据.默认情况下,这将更改ORA_ROWSCN块中的每一行,从而导致查询计算的行数比实际插入的数量多.
由于ORA_ROWSCN只保证是一个上限的最后一次有DML行上,这将是更为常见,以确定通过添加多少行今天插入CREATE_DATE列表,默认值为SYSDATE还是要靠SQL%ROWCOUNT后你的INSERT跑步(当然,假设你使用一个INSERT语句插入所有行).
通常,使用ORA_ROWSCN和SCN_TO_TIMESTAMP函数将是一种有问题的方法来识别何时插入行,即使表是使用构建的ROWDEPENDENCIES. ORA_ROWSCN返回Oracle SCN,它是系统变更号.这是特定更改(即事务)的唯一标识符.因此,SCN与时间之间没有直接联系 - 我的数据库可能比您的数据库生成SCN快一百万倍,而且我的SCN 1可能与您的SCN相差几年.Oracle后台进程SMON维护一个表格,将SCN值映射到近似时间戳,但它只在有限的时间内维护该数据 - 否则,您的数据库最终会得到一个数十亿行表,它只是将SCN存储到时间戳映射中.如果插入的行超过一周前(并且确切的限制取决于数据库和数据库版本),SCN_TO_TIMESTAMP则无法将SCN转换为时间戳并将返回错误.