在ORACLE中利用存儲過程實現異構數據表之間的數據傳輸【DEMO】

昨天,在公司,有位同事要在oracle中作一個數據傳輸工做,兩個表的字段大部分是相同的,不一樣的是主鍵,還有幾個帶索引的字段,我看他半天沒搞定,因而心想,就幫他一把吧。sql

可是,我也不可能替他工做啊,這畢竟仍是他的工做。因而,我就寫一個例子,讓他作個參考。便有了這篇博文。oracle

首先,建兩個結構不一樣的表(PL/SQL圖形界面,好辦!),下面上表結構腳本(數據源表:TEST_FROM;目標表:TEST_TO)
oop

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
)it

建立表完畢,而後就準備數據。(廢話,沒數據,怎麼傳輸啊!)table

數據源表數據:test

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


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  調用建立好的存儲過程。

完成數據遷移。

相關文章
相關標籤/搜索