存储过程之数据迁移

前言:最近需要做数据迁移的工作,我用的是存数过程来做。


废话不多说,先创建表:

  • 数据源表
create table TB_TEST1
(
  t1_a VARCHAR2(100),
  t1_b VARCHAR2(100),
  t1_c VARCHAR2(100),
  t1_d VARCHAR2(100),
  id   VARCHAR2(100)
)
tablespace CRM2
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
  • 存放表
-- Create table
create table TB_TEST2
(
  t2_a  VARCHAR2(100),
  t2_b  VARCHAR2(100),
  t2_ab VARCHAR2(2000),
  id    VARCHAR2(100)
)
tablespace CRM2
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
  • 导入数据
insert into TB_TEST1 (T1_A, T1_B, T1_C, T1_D, ID)
values ('liujian', '中文', 'A', '', '1');

insert into TB_TEST1 (T1_A, T1_B, T1_C, T1_D, ID)
values ('英文', 'jianjian', '', 'b', '2');

前期工作已经做完。

--需求:
-- 1.需要将test1的数据插入到test2中
-- 2.需要判断是否重复,不能插入重复数据
-- 3.需要判断test1中的t1_c和t1_d哪个有值插入哪个到test2的t2_ab字段
create or replace procedure PRO_INTO_TEST2_2
is
cursor cur_test1 is select * from tb_test1;
vs_t1_a tb_test1.t1_a%TYPE; -- 得到字段类型%type
vs_t1_b tb_test1.t1_b%TYPE;
vs_t1_c tb_test1.t1_c%TYPE;
vs_t1_d tb_test1.t1_d%TYPE;
vs_id tb_test1.id%TYPE;
num number;
begin
  open cur_test1; -- 打开游标
  loop -- 循环
    fetch cur_test1 into vs_t1_a, vs_t1_b, vs_t1_c, vs_t1_d, vs_id;
    exit when cur_test1%NOTFOUND; -- 如果没有找到数据退出循环(这个建议写在fetch的下面,这个有点像java的do...while循环)
    -- 判断是否存在
    SELECT COUNT(1) INTO num FROM tb_test2 t WHERE t.id = vs_id;
    -- 哪个有值取哪个
    IF (vs_t1_c IS NULL) THEN 
      vs_t1_c := vs_t1_d;
    END IF;
    -- 如果不存在,就插入数据
    IF(num = 0) THEN
      INSERT INTO tb_test2(id, t2_a, t2_b, t2_ab) 
      VALUES(vs_id, vs_t1_a, vs_t1_b, vs_t1_c);
    END IF;

  end loop;
  close cur_test1;

COMMIT;
end PRO_INTO_TEST2_2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值