在ORACLE中利用存储过程实现异构数据表之间的数据传输【DEMO】

昨天,在公司,有位同事要在oracle中做一个数据传输工作,两个表的字段大部分是相同的,不同的是主键,还有几个带索引的字段,我看他半天没搞定,于是心想,就帮他一把吧。

但是,我也不可能替他工作啊,这毕竟还是他的工作。于是,我就写一个例子,让他做个参考。便有了这篇博文。

首先,建两个结构不同的表(PL/SQL图形界面,好办!),下面上表结构脚本(数据源表:TEST_FROM;目标表:TEST_TO)

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
)

创建表完毕,然后就准备数据。(废话,没数据,怎么传输啊!)

数据源表数据:

1. insert into TEST_FROM (OID, TEXT, TEXT2)
values (1, 'eeee', 'qqq');


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  调用创建好的存储过程。

完成数据迁移。

转载于:https://my.oschina.net/amoswork/blog/134970

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值