本帖最后由 to_be_dba 于 2013-2-1 09:32 编辑
现在有一张四千多万的堆表,(由于业务上很少用,所以没有分区),要通过存储过程将大部分的内容迁移到新系统上。
由于是生产系统,不允许有建索引等操作。
其中主键是A\B\C三列的联合。前导列A基本是唯一的,数据定长,类似06/100000/000000
我的想法是:通过主键的前六位进行截取
首先select distinct substr(A,1,6) from table_name; 放入游标cur中
然后逐个提取游标中的内容,
select * from table_name where A like cur;(试了一下,这样能用到索引,时间十多分钟,可接受)
在内层循环中每次将数据插入到新系统的表中。
不知道这样的思路是否合理,有没有更好的方法。
感谢各位的回复,某些内容没有说清楚,补充如下:
新系统中表结构:
SQL> desc BS_INTR
Name Type Nullable Default Comments
------------- ------------ -------- ------- --------------------------------------------------------------
INTR_SEQ NUMBER(13)
LAST_ACT_DATE DATE
LAST_ACT_TYP VARCHAR2(5)
LAST_ACT_USER VARCHAR2(50)
B_CODE VARCHAR2(2)
CAR VARCHAR2(4) Y
DST VARCHAR2(5)
FBA VARCHAR2(3) Y
FBS VARCHAR2(2) Y
FBT VARCHAR2(15)
FFR VARCHAR2(16) Y
FTD VARCHAR2(5) Y
FTD VARCHAR2(5) Y
FTN VARCHAR2(5) Y
SEQUENCE NUMBER(3)
NAD VARCHAR2(5) Y
NBD VARCHAR2(5) Y
ORA VARCHAR2(5)
RBK VARCHAR2(2)
SEG NUMBER(1)
STPO VARCHAR2(1)
TICKET_SEQ NUMBER(13)
TRANS_SEQ NUMBER(13)
BILL_PERIOD VARCHAR2(6)
旧系统中表结构:
SQL> desc BI_INTR
Name Type Nullable Default Comments
------------- ------------ -------- ------- --------
INTR_SALES_NM CHAR(16)
TICKET_SEQ NUMBER(3)
INTR_NM NUMBER(3)
U_VERSION CHAR(1) Y
INTR_CODE CHAR(4) Y
INTR_ORG VARCHAR2(5) Y
INTR_DST VARCHAR2(5) Y
INTR_STPO VARCHAR2(1) Y
INTR_FBT VARCHAR2(15) Y
INTR_SEG VARCHAR2(1) Y
INTR_NBD VARCHAR2(5) Y
INTR_NAD VARCHAR2(5) Y
INTR_IVC VARCHAR2(1) Y
INTR_FTN VARCHAR2(5) Y
INTR_CLS VARCHAR2(2) Y
INTR_FTD VARCHAR2(5) Y
INTR_FTD VARCHAR2(5) Y
INTR_FBS VARCHAR2(2) Y
INTR_FBA VARCHAR2(3) Y
INTR_PRV VARCHAR2(11) Y
INTR_FFR VARCHAR2(16) Y
CRE_DATE DATE Y
CRE_USR_ID VARCHAR2(6) Y
MOD_DATE DATE Y
MOD_USR_ID VARCHAR2(6) Y
新系统的表结构、列名已经定义好了,以前的列名格式“INTR_XXXX”都已经改为“XXXX”,还加了几个迁移过程中的时间、操作人等信息,其他几列的值未给出,暂时置空。
根据要求,都是需要用存储过程来执行的,这一点我改变不了。
新旧两套系统是在不同的服务器上的。旧表的全部记录,只取部分列插入新系统。新系统无业务,不会立即投入使用。