前言:最近需要做数据迁移的工作,我用的是存数过程来做。
废话不多说,先创建表:
- 数据源表
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;