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