1. 程式人生 > >儲存過程之資料遷移

儲存過程之資料遷移

前言:最近需要做資料遷移的工作,我用的是存數過程來做。

廢話不多說,先建立表:

  • 資料來源表
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;