connect scott/tiger
接続されました。
SQL> @?\rdbms\admin\utlchain

表が作成されました。

SQL> create table test (col1 number, col2 varchar2(4000), col3 varchar2(4000));

表が作成されました。

SQL> declare
  2  cnt number;
  3  begin
  4  for cnt in 1..10 loop
  5  insert into test values(cnt, rpad('A', 1500, 'A'), rpad('B', 1500, 'B'));
  6  end loop;
  7  commit;
  8  end;
  9  /

PL/SQLプロシージャが正常に完了しました。

SQL> analyze table test list chained rows;

表が分析されました。

SQL>  select head_rowid from chained_rows;

レコードが選択されませんでした。

SQL> rem col2, col3を長くしてupdateすることで行移行を発生させる
SQL> update test set col2 = rpad('C', 3000, 'C'),
  2  col3 = rpad('D', 3000, 'D') where col1 in (3, 9);

2行が更新されました。

SQL> commit;

コミットが完了しました。

SQL> analyze table test list chained rows;

表が分析されました。

SQL> select head_rowid from chained_rows;

HEAD_ROWID                                                                      
------------------                                                              
AAAXE5AAJAAAAFtAAA                                                              
AAAXE5AAJAAAAFvAAA                                                              

SQL> create table work_test as select * from test
  2  where exists (select 'X' from chained_rows
  3  where head_rowid = test.rowid);

表が作成されました。

SQL> delete from test where exists (select 'X' from chained_rows
  2  where head_rowid = test.rowid);

2行が削除されました。

SQL> insert into test select * from work_test;

2行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> rem 古いデータが残っているので、analyze前にchained_rowsテーブルを切り捨て
SQL> truncate table chained_rows;

表が切り捨てられました。

SQL> analyze table test list chained rows;

表が分析されました。

SQL> select head_rowid from chained_rows;

レコードが選択されませんでした。

SQL> drop table work_test;

表が削除されました。