OceanBaseデータベースは、データを保存する際にマルチバージョンストレージを使用します。テーブル内では、ORA_ROWSCN をテーブルの一列と見なすことができ、この列の値は各行データの最新バージョン番号を表します。2つのトランザクション 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