--------------------------------------------------------------------------------
-- Goal: To modify a table structure with low impact
-- from DATE to TIMESTAMP assuming T1 table is a multi million row table
-- and T1 table is an -- highly available table.
--------------------------------------------------------------------------------
RMATTE@hhp3 SQL> drop table t1 purge;
Table dropped.
RMATTE@hhp3 SQL> create table t1 as select * from dba_objects;
Table created.
RMATTE@hhp3 SQL> create index t1_idx_01 on t1(object_id);
Index created.
RMATTE@hhp3 SQL> delete from t1 where object_id is NULL;
22 rows deleted.
RMATTE@hhp3 SQL> commit;
Commit complete.
RMATTE@hhp3 SQL> alter table t1 add constraint pk_t1_01 primary key(object_id);
Table altered.
RMATTE@hhp3 SQL> desc t1;
Name Null? Type
- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
--------------------------------------------------------------------------------
-- Create a interim table that matches your target table requirements.
-- You can specify partition option or different storage parameters.
--------------------------------------------------------------------------------
CREATE TABLE RMATTE.T1_INTERIM
(
OWNER VARCHAR2(30 BYTE),
OBJECT_NAME VARCHAR2(128 BYTE),
SUBOBJECT_NAME VARCHAR2(30 BYTE),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19 BYTE),
CREATED TIMESTAMP(6),
LAST_DDL_TIME TIMESTAMP(6),
TIMESTAMP VARCHAR2(19 BYTE),
STATUS VARCHAR2(7 BYTE),
TEMPORARY VARCHAR2(1 BYTE),
GENERATED VARCHAR2(1 BYTE),
SECONDARY VARCHAR2(1 BYTE)
)
/
--------------------------------------------------------------------------------
-- Check whether you can redefine your table or not?
--------------------------------------------------------------------------------
RMATTE@hhp3 SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('RMATTE', 'T1', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------
-- This function is required because to_timestamp parameter is not compatible with dbms_redifinition package.
--------------------------------------------------------------------------------
create or replace function my_to_timestamp(p_date date) return timestamp is
begin
return to_timestamp(p_date);
end;
/
Function created.
--------------------------------------------------------------------------------
-- Start the redefinition process. It will move all records from source table to interim table(target table).
--------------------------------------------------------------------------------
RMATTE@hhp3 SQL> BEGIN
2 dbms_redefinition.start_redef_table('RMATTE', 'T1','T1_INTERIM',
3 'OWNER,
4 OBJECT_NAME,
5 SUBOBJECT_NAME,
6 OBJECT_ID,
7 DATA_OBJECT_ID,
8 OBJECT_TYPE,
9 my_to_timestamp(CREATED) CREATED,
10 11 my_to_timestamp(LAST_DDL_TIME) LAST_DDL_TIME,
12 13 TIMESTAMP,
14 STATUS,
15 TEMPORARY,
16 GENERATED,
17 SECONDARY',DBMS_REDEFINITION.CONS_USE_PK);
18 END;
19 /
PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------
-- Move all dependent objects from source table to interim table (Target table).
-- It will create the depended objects with TMP names.
--------------------------------------------------------------------------------
RMATTE@hhp3 SQL> DECLARE
2 RETVAL NUMBER(5);
3 BEGIN
4 dbms_redefinition.copy_table_dependents('RMATTE', 'T1', 'T1_INTERIM', copy_indexes=>dbms_redefinition.cons_orig_params, copy_triggers=>TRUE, copy_constraints=>TRUE,copy_privileges=>TRUE, num_errors=>RETVAL);
5 dbms_output.put_line(RETVAL);
6 END;
7 /
0
PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------
-- Complete the redefinition process.
-- It flips the sources table name/dependent objects with interim tablename/dependent objects (target table).
--------------------------------------------------------------------------------
RMATTE@hhp3 SQL> EXEC dbms_redefinition.finish_redef_table('RMATTE', 'T1', 'T1_INTERIM');
PL/SQL procedure successfully completed.
RMATTE@hhp3 SQL> DESC T1;
Name Null? Type
- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED TIMESTAMP(6)
LAST_DDL_TIME TIMESTAMP(6)
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
RMATTE@hhp3 SQL> DESC T1_INTERIM;
Name Null? Type
- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
RMATTE@hhp3 SQL> DROP TABLE T1_INTERIM;
Table dropped.
