oracle12cからオンライン再定義機能のうち、表領域の変更や圧縮タイプの変更は1ステップで可能になりました。
しかし、それ以外の、例えば列追加などは以前のような複雑な手順です。

CREATE TABLE emp_redef
(empno      NUMBER(5) PRIMARY KEY,
 ename      VARCHAR2(15) NOT NULL,
 job        VARCHAR2(10),
 deptno     NUMBER(3) NOT NULL)
 TABLESPACE USERS;

表が作成されました。

SQL> desc emp_redef
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(5)
 ENAME                                     NOT NULL VARCHAR2(15)
 JOB                                                VARCHAR2(10)
 DEPTNO                                    NOT NULL NUMBER(3)


まずはテスト用のテーブルを作成します。
この表に対して以下の定義変更を行ないます。

・新しい列mgr、hiredate、salおよびbonusを追加します。
・新しい列bonusを0 (ゼロ)に初期化します。
・列deptnoの値を10増やしています。

BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE(
    uname        => 'tadashi',
    tname        =>'emp_redef',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/


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


表がオンライン再定義可能か確認しています。
エラーが出力されていなければ、問題有りません。

CREATE TABLE int_emp_redef
        (empno      NUMBER(5) PRIMARY KEY,
         ename      VARCHAR2(15) NOT NULL,
         job        VARCHAR2(10),
         mgr        NUMBER(5),
         hiredate   DATE DEFAULT (sysdate),
         sal        NUMBER(7,2),
         deptno     NUMBER(3) NOT NULL,
         bonus      NUMBER (7,2) DEFAULT(0))
TABLESPACE USERS;

SQL> desc int_emp_redef;
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(5)
 ENAME                                     NOT NULL VARCHAR2(15)
 JOB                                                VARCHAR2(10)
 MGR                                                NUMBER(5)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 DEPTNO                                    NOT NULL NUMBER(3)
 BONUS                                              NUMBER(7,2)


定義変更後の表を仮表として作成します。

BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname        => 'tadashi',
    orig_table   => 'emp_redef',
    int_table    => 'int_emp_redef',
    col_mapping  => 'empno empno, ename ename, job job, deptno+10 deptno,
                     0 bonus',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/

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


オンライン再定義を開始します。

DECLARE
num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    uname            => 'tadashi',
    orig_table       => 'emp_redef',
    int_table        => 'int_emp_redef',
    copy_indexes     => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
    copy_triggers    => TRUE,
    copy_constraints => TRUE,
    copy_privileges  => TRUE,
    ignore_errors    => TRUE,
    num_errors       => num_errors);
END;
/

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


元表から仮表へ制約やトリガーをコピーします。

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE(
    uname      => 'tadashi',
    orig_table => 'emp_redef',
    int_table  => 'int_emp_redef');
END;
/

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


オンライン再定義を終了します。

SQL> desc emp_redef;
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(5)
 ENAME                                     NOT NULL VARCHAR2(15)
 JOB                                                VARCHAR2(10)
 MGR                                                NUMBER(5)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 DEPTNO                                    NOT NULL NUMBER(3)
 BONUS                                              NUMBER(7,2)

SQL> desc int_emp_redef;
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(5)
 ENAME                                     NOT NULL VARCHAR2(15)
 JOB                                                VARCHAR2(10)
 DEPTNO                                    NOT NULL NUMBER(3)


この時点で元表と仮表が入れ替わりました。
元表に列が追加されています。
ここまで全てオンラインでの作業です。