In either case, there is a large potential issue left hanging -if the rows have grown to such an extent that they no longer fit back in their current block, you've now got a giant row migration mess which could be a performance problem.
To fix that... you need to do an alter-table-move, and suddenly, you've got application outages coming out of your ears :-)
How about this for an alternative approach - use DBMS_REDEFINITION with column mapping to populate the new column. Here's an example (I've added some constraints and triggers to show that we can copy all that over as well)
SQL> create table t as select * from scott.emp;
Table created.
SQL>
SQL> alter table t add primary key (empno);
Table altered.
SQL>
SQL> alter table t add constraint CK check ( sal >= 0 );
Table altered.
SQL>
SQL> create or replace
2 trigger t_TRG
3 before insert on t
4 for each row
5 begin
6 :new.sal := :new.sal * 10 ;
7 end;
8 /
Trigger created.
SQL>
SQL> create table new_t (
2 EMPNO NUMBER(4)
3 ,ENAME VARCHAR2(10)
4 ,JOB VARCHAR2(9)
5 ,MGR NUMBER(4)
6 ,HIREDATE DATE
7 ,SAL NUMBER(7,2)
8 ,COMM NUMBER(7,2)
9 ,DEPTNO NUMBER
10 ,NEW_COL varchar2(30) default 'Hello' not null --- Our new column with default not null
11 );
Table created.
SQL>
SQL> exec dbms_redefinition.can_redef_table(user, 'T');
PL/SQL procedure successfully completed.
SQL>
SQL> exec dbms_redefinition.start_redef_table(user, 'T', 'NEW_T', col_mapping=>'empno,ename,job,mgr,hiredate,sal,comm,deptno,''Hello'' new_col');
PL/SQL procedure successfully completed.
SQL> exec dbms_redefinition.sync_interim_table(user, 'T', 'NEW_T');
PL/SQL procedure successfully completed.
SQL> set serveroutput on
SQL> declare
2 l_err pls_integer;
3 begin
4 dbms_redefinition.copy_table_dependents(
5 uname => user,
6 orig_table => 'T',
7 int_table => 'NEW_T',
8 num_errors => l_err
9 );
10
11 dbms_output.put_line('errors=' || l_err);
12 end;
13 /
errors=0
PL/SQL procedure successfully completed.
SQL>
SQL> exec dbms_redefinition.finish_redef_table(user, 'T', 'NEW_T');
PL/SQL procedure successfully completed.
SQL>
SQL> desc t
Name Null? Type
----------------------------------------------------------------------- -------- ------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER
NEW_COL NOT NULL VARCHAR2(30)
SQL> select empno, ename, new_col from t;
EMPNO ENAME NEW_COL
---------- ---------- ------------------------
7369 SMITH Hello
7499 ALLEN Hello
7521 WARD Hello
7566 JONES Hello
7654 MARTIN Hello
7698 BLAKE Hello
7782 CLARK Hello
7788 SCOTT Hello
7839 KING Hello
7844 TURNER Hello
7876 ADAMS Hello
7900 JAMES Hello
7902 FORD Hello
7934 MILLER Hello
14 rows selected.