昨天,在公司,有位同事要在oracle中作一个数据传输工做,两个表的字段大部分是相同的,不一样的是主键,还有几个带索引的字段,我看他半天没搞定,因而心想,就帮他一把吧。sql
可是,我也不可能替他工做啊,这毕竟仍是他的工做。因而,我就写一个例子,让他作个参考。便有了这篇博文。oracle
首先,建两个结构不一样的表(PL/SQL图形界面,好办!),下面上表结构脚本(数据源表:TEST_FROM;目标表:TEST_TO)
oop
create table TEST_FROM
(
OID NUMBER not null,
TEXT VARCHAR2(50),
TEXT2 VARCHAR2(100)
)
索引
create table TEST_TO
(
TEXT VARCHAR2(50),
TEXT2 VARCHAR2(100),
TID NUMBER,
OOID NUMBER default 1 not null
)it
建立表完毕,而后就准备数据。(废话,没数据,怎么传输啊!)table
数据源表数据:test
1. insert into TEST_FROM (OID, TEXT, TEXT2)
values (1, 'eeee', 'qqq');select
2. insert into TEST_FROM (OID, TEXT, TEXT2)
values (2, 'ttt', 'www');循环
3. insert into TEST_FROM (OID, TEXT, TEXT2)
values (3, 'qqqq', 'fffff');
方法
目标表数据:
1. insert into TEST_TO (TEXT, TEXT2, TID, OOID)
values ('gsgrr', 'yyyy', 1, 1);
2. insert into TEST_TO (TEXT, TEXT2, TID, OOID)
values ('gsrfsg', 'sgfsg', 2, 2);
3. insert into TEST_TO (TEXT, TEXT2, TID, OOID)
values ('eeee', 'qqq', 1, 3);
4. insert into TEST_TO (TEXT, TEXT2, TID, OOID)
values ('ttt', 'www', 2, 4);
5. insert into TEST_TO (TEXT, TEXT2, TID, OOID)
values ('qqqq', 'fffff', 3, 5);
因为表结构是异构的,因此,咱们在传输数据的时候,对于目标表存在,而数据源表没有的字段,要作数据的填充(若是是非空,就给默认值就好,若是是主键,或者单一索引,则须要生成有序数据,生成方法看实际状况而定。各位,本身斟酌。),这里以连续数列的每一项作为数据主键。因此,存储过程须要包含一个产生数列项的循环。建立存储过程
create or replace procedure CHANGEFER_DATA as
v_rowCount NUMBER := 0;
v_clUnitID number := 0;
begin
select max(tid) into v_rowCount from test_to;
FOR v_record in (select a.oid, a.text, a.text2 from test_from a) loop //v_record 源数据集游标,包含查询结果集合
v_rowCount := v_rowCount + 1; //以循环计数器,做为目标数据表的数据主键值
insert into test_to
(ooid, tid, text, text2)
values
(v_rowCount, v_record.oid, v_record.text, v_record.text2); //插入数据,源数据在游标v_record里,同过度量运算符“.”得到
end loop;
commit; //提交存储过程
end CHANGEFER_DATA;
最后,经过sql命令 call CHANGEFER_DATA 调用建立好的存储过程。
完成数据迁移。