デフォルトでは、ORA_ROWSCN
行レベルではなく、ブロック レベルで格納されます。テーブルが最初に ROWDEPENDENCIES
で構築された場合、行レベルでのみ保存されます 有効にします。テーブルの多くの行を 1 つのブロックに収めることができ、APPEND
を使用していないと仮定すると、 テーブルの既存の最高水準点より上に新しいデータを挿入するようにヒントすると、既存のデータが既に含まれているブロックに新しいデータを挿入する可能性があります。デフォルトでは、これにより ORA_ROWSCN
が変更されます
ORA_ROWSCN
以降 行に最後に DML があったときの上限であることが保証されているだけです。 CREATE_DATE
を追加して、今日挿入された行数を判断する方がはるかに一般的です。 SYSDATE
にデフォルト設定されるテーブルへの列 または SQL%ROWCOUNT
に依存する INSERT
の後 実行しました (もちろん、単一の INSERT
を使用していると仮定します) すべての行を挿入するステートメント)。
通常、ORA_ROWSCN
を使用して と SCN_TO_TIMESTAMP
この関数は、テーブルが ROWDEPENDENCIES
で構築されていても、行がいつ挿入されたかを特定する方法として問題があります。 . ORA_ROWSCN
システム変更番号である Oracle SCN を返します。これは、特定の変更 (つまり、トランザクション) の一意の識別子です。そのため、SCN と時間の間に直接のリンクはありません。私のデータベースは、あなたのデータベースよりも 100 万倍も速く SCN を生成している可能性があり、私の SCN 1 はあなたの SCN 1 とは年数が異なる可能性があります。Oracle バックグラウンド プロセス SMON
SCN 値をおおよそのタイムスタンプにマップするテーブルを維持しますが、限られた期間のみそのデータを維持します。そうしないと、データベースは、SCN からタイムスタンプへのマッピングを格納するだけの数十億行のテーブルになってしまいます。行がたとえば 1 週間以上前に挿入された場合 (正確な制限はデータベースとデータベースのバージョンによって異なります)、SCN_TO_TIMESTAMP
SCN をタイムスタンプに変換できず、エラーが返されます。