12cの新機能、In Database ArchiveはOracleで表の論理削除を実現する機能です。

CREATE TABLE tab1 (
    id NUMBER,
    description VARCHAR2(50),
    CONSTRAINT tab1_pk PRIMARY KEY (id)
)
ROW ARCHIVAL;


テスト用に表を作成します。
「ROW ARCHIVAL;」をCREATE TABLE文に付与することで、その表のIn Database Archiveが有効になります。

SQL> ALTER TABLE tab1 NO ROW ARCHIVAL;

表が変更されました。

SQL> ALTER TABLE tab1 ROW ARCHIVAL;

表が変更されました。


ALTER文で既存の表のIn Database Archive有効、無効が設定できます。

COLUMN column_name FORMAT A20
COLUMN data_type FORMAT A20

SELECT column_id,
       column_name,
       data_type,
       data_length,
       hidden_column
FROM   user_tab_cols
WHERE  table_name = 'TAB1'
ORDER BY column_id;


 COLUMN_ID COLUMN_NAME          DATA_TYPE            DATA_LENGTH HID
---------- -------------------- -------------------- ----------- ---
         1 ID                   NUMBER                        22 NO
         2 DESCRIPTION          VARCHAR2                      50 NO
           ORA_ARCHIVE_STATE    VARCHAR2                    4000 YES
           SYS_NC00003$         RAW                          126 YES


descでは表示されませんが、user_tab_colsビューを見ると「ORA_ARCHIVE_STATE」列が追加されていることがわかります。

INSERT /*+ APPEND */ INTO tab1
SELECT level,'Description of ' || level
FROM dual
CONNECT BY level <= 1000;

COMMIT;

SELECT count(*) FROM tab1;

  COUNT(*)
----------
      1000


テスト用にデータ1000件を挿入します。

COLUMN ORA_ARCHIVE_STATE FORMAT A20

SELECT ora_archive_state, COUNT(*)
FROM tab1
GROUP BY ora_archive_state
ORDER BY ora_archive_state;

ORA_ARCHIVE_STATE      COUNT(*)
-------------------- ----------
0                          1000


1000件のデータのORA_ARCHIVE_STATE列は、最初は全て0に設定されています。

UPDATE tab1
SET ora_archive_state = '1'
WHERE id BETWEEN 751 and 1000;
COMMIT;


751件目から1000件目のORA_ARCHIVE_STATEを「1」に更新します。

SELECT COUNT(*) FROM tab1;

  COUNT(*)
----------
       750


countで表示されるデータ件数が750件になりました。
751件目から1000件目が「論理削除」されたことになります。
「論理」削除なので実体は存在します。
見えなくなっただけです。

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

セッションが変更されました。

SQL> SELECT COUNT(*) FROM tab1;

  COUNT(*)
----------
      1000


ROW ARCHIVAL VISIBILITY値をALLに設定することで、全てのデータが見えるようになります。

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;

セッションが変更されました。

SQL> SELECT COUNT(*) FROM tab1;

  COUNT(*)
----------
       750


ROW ARCHIVAL VISIBILITY値をACTIVEに設定することで、ORA_ARCHIVE_STATE列が1に設定されている行が見えなくなります。(デフォルト)