I get an error while doing the redefinition. Following are the steps which I have taken so far:
Step 1. Start redefinition
DBMS_REDEFINITION.CAN_REDEF_TABLE(v_name, 'T_FDC_TOOLCONTEXT',
dbms_redefinition.CONS_USE_ROWID);
Successful
Step 2. Creating a interim table
CREATE TABLE "CDS_USER"."T_FDC_TOOLCONTEXT_ONLINE"
( "SERIAL_ID" NUMBER(15,0),
"CONTEXTID" NUMBER(15,0) NOT NULL ENABLE,
"ENTITYNAME" VARCHAR2(35 BYTE) NOT NULL ENABLE,
"ENTITYCOMPONENT" VARCHAR2(10 BYTE),
"SOLUTIONTYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
"JOBTIMESTAMP" DATE NOT NULL ENABLE,
"EAJOBNAME" VARCHAR2(35 BYTE),
"PRJOBNAME" VARCHAR2(35 BYTE),
"FAJOBNAME" VARCHAR2(50 BYTE),
"STEPNAME" VARCHAR2(80 BYTE),
"LOTNAME" VARCHAR2(20 BYTE),
"LOTTYPE" VARCHAR2(20 BYTE),
"CARRIERNAME" VARCHAR2(20 BYTE),
"PRODUCTNAME" VARCHAR2(80 BYTE),
"RECIPENAME" VARCHAR2(80 BYTE),
"WAFERID" VARCHAR2(23 BYTE),
"MATERIALNAME" VARCHAR2(20 BYTE),
"MATERIALCOUNT" NUMBER(4,0),
"CAPACITY" NUMBER(4,0),
"TECHNOLOGY" VARCHAR2(128 BYTE),
"RETICLE" VARCHAR2(60 BYTE),
"LAYER" VARCHAR2(20 BYTE),
"SWRLOT" VARCHAR2(5 BYTE),
"PORTNAME" NUMBER(1,0),
"SLOT" NUMBER(3,0),
"RUNNUMBER" NUMBER(2,0),
"MVINTIME" DATE,
"ROUTE" VARCHAR2(80 BYTE),
"EPA" VARCHAR2(64 BYTE),
"PROCTIME" DATE,
"IMAGEID" VARCHAR2(25 BYTE),
"PRODUCTGROUP" VARCHAR2(25 BYTE),
"BASICTYPE" VARCHAR2(25 BYTE),
"PRETOOL" VARCHAR2(25 BYTE),
"REWORK" VARCHAR2(100 BYTE),
"SENDAHEAD" VARCHAR2(100 BYTE),
"SEQUENCE" VARCHAR2(80 BYTE),
"RSN" VARCHAR2(25 BYTE),
"COMPLETED" NUMBER(1,0) DEFAULT 0,
"LAYER2" VARCHAR2(20 BYTE),
"RETICLE2" VARCHAR2(60 BYTE),
"TRUSTED_FLAG" VARCHAR2(2 BYTE),
"VALID_FLAG" VARCHAR2(5 BYTE),
"RECIPE" VARCHAR2(80 BYTE),
"POSITIONTYPE" VARCHAR2(10 BYTE),
"PROCESS_TYPE" VARCHAR2(3 BYTE),
"IN_WORK" NUMBER(1,0) DEFAULT 0,
"D_CARRIERNAME" VARCHAR2(25 BYTE),
"SUMOSTEP" VARCHAR2(10 BYTE),
"INSERTED_TIME" DATE DEFAULT SYSDATE,
PRIMARY KEY ("SERIAL_ID"))
PARTITION BY RANGE ("INSERTED_TIME")
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(PARTITION "p1_1" VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))
Successful
Step 3. Starting the redefinition
DBMS_REDEFINITION.START_REDEF_TABLE (uname => v_name,
orig_table => 'T_FDC_TOOLCONTEXT',
int_table => 'T_FDC_TOOLCONTEXT_ONLINE',
col_mapping => '', options_flag => DBMS_REDEFINITION.CONS_USE_ROWID);
Successful
Step 4. Copying the dependents
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(v_name, 'T_FDC_TOOLCONTEXT',
'T_FDC_TOOLCONTEXT_ONLINE',
dbms_redefinition.cons_orig_params,
TRUE, TRUE, TRUE, FALSE, error_count);
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
Error:
ORA-01408: such column list already indexed.
I have following indexes on my existing column.
CREATE UNIQUE INDEX "CDS_USER"."SYS_C0012094" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("SERIAL_ID")
CREATE INDEX "CDS_USER"."I_FDC_CONTEXTID" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("CONTEXTID")
CREATE INDEX "CDS_USER"."I_FDC_ENTITY" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("ENTITYNAME")
CREATE INDEX "CDS_USER"."I_FDC_TIMESTAMP"ON"CDS_USER"."T_FDC_TOOLCONTEXT"("JOBTIMESTAMP")
CREATE INDEX "CDS_USER"."I_FDC_CTRL" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("EAJOBNAME")
CREATE INDEX "CDS_USER"."I_FDC_PRJ" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("PRJOBNAME")
CREATE INDEX "CDS_USER"."I_FDC_CARRIER" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("CARRIERNAME")
CREATE INDEX "CDS_USER"."I_FDC_MATERIAL" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("MATERIALNAME")
CREATE INDEX "CDS_USER"."I_FDC_PORT" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("PORTNAME")
CREATE INDEX "CDS_USER"."I_FDC_SLOT" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("SLOT")
CREATE INDEX "CDS_USER"."I_FDC_ENTITY_LOT" ON "CDS_USER"."T_FDC_TOOLCONTEXT" ("ENTITYNAME", "LOTNAME")
What can I do to avoid the error?
Best Answer
Ok, minimal test case that reproduces the error, showing it's the intermediate table PK that is the problem:
You have 2 options to fix this.
Option 1 - create the intermediate table without a primary key (best option!!):
Option 2 - simply tell
DBMS_REDEFINITION
to ignore the error (ignore_errors=>true
).It looks like there are some errors, but they don't matter as the PK constraint and index was created when the intermediate table was created: