儲存過程之資料遷移
阿新 • • 發佈:2019-02-05
前言:最近需要做資料遷移的工作,我用的是存數過程來做。
廢話不多說,先建立表:
- 資料來源表
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;