2016-12-28 132 views
0

我试图使用以下查询来获取表中所有记录的最后更新日期和时间。带时间戳记的最后更新记录

SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN),id FROM TABLE_NAME 

对于有些表的显示结果正确,但对于其他人我得到了以下错误消息(具体我使用的是从这些自动生成的HR模式表)

ORA- 08181:指定数目不是有效的系统改变号

ORA-06512:在 “SYS.SCN_TO_TIMESTAMP”,第1行

  • 00000 - “指定的数量不一个有效的系统更改号码“
  • *原因:提供的scn超出了有效scn的范围。 *操作:使用有效的scn。

    为什么我收到此错误消息?在运行查询之前,我为同一个表运行了几个插入和更新查询。

    谢谢

    +0

    此外,最好有一个额外的列来跟踪数据的变化。 ORA_ROWSCN是非常不可行的,不适用于旧数据(例如您的情况)。 – GurV

    回答

    1

    Oracle 10g和9i中有一个限制,只能在5天后闪回。在Oracle 11g中没有限制。

    您可以检查数据库中最旧的可用系统更改号码(SCN)号码。

    使用此查询

    select min(SCN) min_scn from sys.smon_scn_time; 
    

    从上面的查询使用SCN号,你可以得到的最后一个时间戳,SCN

    SELECT SCN_TO_TIMESTAMP(scn number here) FROM dual; 
    

    如果检查旧的SCN比最低SCN那么你会得到错误。

    来源link

    +0

    '从sys.smon_scn_time选择min(SCN)min_scn;'给我“ORA-00942:表或视图不存在”。这与Oracle 11g上的SQL Developer有关。 – mivk

    1

    SCN(去年DML操作的系统改变号)中产生,并通过了Oracle为有限的时间内记住。您正在将旧的scn转换为时间戳并引发错误。

    ORA_ROWSCN有两种行为。如果tabe使用"NOROWDEPENDENCIES"(默认值)创建。 ORA_ROWSCN返回oracle数据块的scn编号。

    如果tabe使用"ROWDEPENDENCIES"创建。 ORA_ROWSCN返回行的scn编号。