OceanBaseデータベースは、データ保存時にマルチバージョンストレージを採用しています。テーブル内でORA_ROWSCNは一つの列と見なすことができ、その列の値は各行データの最新バージョン番号を表します。二つのトランザクションt1とt2について、仮にt1が先にコミットされ、その後t2がコミットされた場合、OceanBaseはt1が発生した後のORA_ROWSCNがt2が発生した後のORA_ROWSCNより小さいことを保証します。OceanBaseデータベースでは、ORA_ROWSCNは単調増加します。Oracleデータベースとは異なり、OracleデータベースのORA_ROWSCNはシステム内の論理的な数値であり、実際の意味はありません。一方、OceanBaseデータベースでは、ORA_ROWSCNはデータ変更を行ったトランザクションがコミットされた時点のシステム時刻であり、意味のある時間に変換することができます。
注意事項
ORA_ROWSCNは実体テーブルでのみ使用でき、ビューのクエリではORA_ROWSCN疑似列を使用できません。ORA_ROWSCNは通常の列のようにWHEREなどの式に記述できます。ORA_ROWSCNは予約語ではないため、列定義の名前がORA_ROWSCNと同じ場合、ORA_ROWSCN疑似列は機能しません。ORA_ROWSCNはFLASHBACK QUERYステートメントと併用できません。併用するとORA_ROWSCNの意味が曖昧になります。
例
テストテーブル
tbl1を作成します。CREATE TABLE tbl1(col1 INT);テーブル
tbl1にテストデータを1件挿入します。INSERT INTO tbl1 VALUES(10);再度テーブル
tbl1にテストデータを3件挿入します。INSERT INTO tbl1 VALUES(30),(40),(50);テーブル
tbl1のcol1 = 10の列に対応するORA_ROWSCNを取得します。SELECT ORA_ROWSCN FROM tbl1 WHERE col1 = 10;実行結果は次のとおりです:
+---------------------+ | ORA_ROWSCN | +---------------------+ | 1721975097797659000 | +---------------------+ 1 row in set指定された
ORA_ROWSCN値を持つデータを取得します。まるで一括トランザクションでデータをコミットした場合、ORA_ROWSCNがすべて同じであるかのようにします。テーブル
tbl1のcol1 = 30/40/50の列に対応するORA_ROWSCNを取得します。SELECT col1, ORA_ROWSCN FROM tbl1 WHERE col1 IN (30,40,50);実行結果は次のとおりです:
+------+---------------------+ | COL1 | ORA_ROWSCN | +------+---------------------+ | 30 | 1721975326593884000 | | 40 | 1721975326593884000 | | 50 | 1721975326593884000 | +------+---------------------+ 3 rows in setテーブル
tbl1を更新します。ORA_ROWSCNの値を指定して更新対象の行を特定し、その後col1の値を20に更新します。UPDATE tbl1 SET col1 = 20 WHERE ORA_ROWSCN = 1721975326593884000;実行結果は次のとおりです:
Query OK, 3 rows affected Rows matched: 3 Changed: 3 Warnings: 0
ORA_ROWSCNを式で使用します。SELECT col1, ORA_ROWSCN FROM tbl1 WHERE ORA_ROWSCN + 1 = 1721975097797659001;実行結果は次のとおりです:
+------+---------------------+ | COL1 | ORA_ROWSCN | +------+---------------------+ | 10 | 1721975097797659000 | +------+---------------------+ 1 row in set