oracle資料遷移

2021-09-24 13:01:46 字數 4571 閱讀 2304

最近老大要我做幾張流水表的資料遷移,要求每天定時清理a表180天前資料,把它先導入歷史表b表中(b表結構和a表一致),然後刪除a表180天前資料。

思路:先寫乙個遷移的儲存過程,在建立乙個oracle的job(定時任務)來定時執行 :

create or replace procedure pb_clear_test_1(

in_keepday      number, --清理多少天前資料

in_commit       number --每次commit提交資料)as

n_records       number:=0;--插入+清理計數器

n_totcommit     number:=0;--事務提交次數

n_totrecords    number:=0;--清理總記錄數

n_opencur       number:=0;--游標計數器

c_trandate      varchar(8);

n_insertrecords    number:=0;--插入總記錄數

paylog_type   tbl_test_log%rowtype;

cursor cur_trans_log(trandate char) is

select * from tbl_test_log

where ext_txn_dt <= trandate;

begin

dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh:mi:ss')||' begin deal records of tbl_test_log!');

c_trandate := to_char(sysdate-in_keepday, 'yyyymmdd');

loop

n_opencur := n_opencur + 1;

open cur_trans_log(c_trandate);

loop

fetch cur_trans_log into paylog_type;

exit when cur_trans_log%notfound;

--逐條插入歷史表

insert into tbl_test_his_log select * from tbl_test_log

where inst_code= paylog_type.inst_code

and   ext_txn_dt = paylog_type.ext_txn_dt

and   mer_id = paylog_type.mer_id

and   serialno= paylog_type.serialno;

n_insertrecords := n_insertrecords + 1;

n_totcommit := n_totcommit + 1;

--逐條刪除

delete from tbl_test_log

where inst_code= paylog_type.inst_code

and   ext_txn_dt = paylog_type.ext_txn_dt

and   mer_id = paylog_type.mer_id

and   serialno= paylog_type.serialno;

n_records := n_records + 2;

n_totrecords := n_totrecords + 1;

--超過指定條數提交

if n_records >= in_commit then

commit;

n_records := 0;

n_totcommit := n_totcommit + 2;

end if;

end loop;

exit when cur_trans_log%notfound;

close cur_trans_log;

end loop;

close cur_trans_log;

commit;

n_totcommit := n_totcommit + 1;

dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh:mi:ss')||' finished!');

dbms_output.put_line('totally '||to_char(n_insertrecords)||' records moved!'||' committed '||to_char(n_totcommit)||'. open cursor '||to_char(n_opencur)||' times.');

dbms_output.put_line('totally '||to_char(n_totrecords)||' records moved!'||' committed '||to_char(n_totcommit)||'. open cursor '||to_char(n_opencur)||' times.');

exception

when others then

rollback;

dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh:mi:ss')||' get exception! '||sqlerrm);

dbms_output.put_line('totally '||to_char(n_totrecords)||' records moved!'||' committed '||to_char(n_totcommit)||'. open cursor '||to_char(n_opencur)||' times.');

return;

end;

/這個儲存過程是前人留下的,我勉強看懂,這裡行尾的/是我加的,因為我發現不加這個/,不會執行完,不然你得再在命令列裡加個/讓這個sql執行,還有這個儲存過程之前是半年執行一次的,所以要迴圈移動和刪除每一條資料,並要加上commit的條數來提高效率,不然一次性移動和刪除大量資料會很慢的,不過我沒搞懂拿到整個迴圈體的select 語句不會執行很慢嗎?不知道還有大神指導下。這裡我也偷懶了吧,每天執行的話,資料量不大,不用寫這麼複雜的,不用迴圈的。

測試儲存過程中發現,測試環境沒有歷史表的,然後get到乙個新的知識點,建立乙個和a表結果結果一樣的b表語句:

create table_b as select * from table_a  where 1<>1;--只建立表結構,不把a表資料塞入新錶中

create table_b as select * from table_a  ;建立和table_a表結構和資料一樣的table_b表

上述建立儲存過程的sql執行發到sql執行視窗執行即可,如果是命令列也可以執行這樣執行,最好放到乙個檔案裡,然後@這個檔案執行。

如果你想看這個儲存過程有沒有建立成功,可以執行:

select text from user_source where name ='儲存過程名稱' order by line;

如果你想執行這個儲存過程,要看你在哪執行:

如果在sql視窗中執行,要按如下方式執行:

declare

begin

test_pro_001;--儲存過程名稱,如果帶引數,就加括號並帶上引數;

end;

或者call test_pro_001();

如果是在命令列視窗執行:

exec test_pro_001();

可以參考: 

下面寫下用定時任務調起上面的儲存過程:

declare

job number;

begin

dbms_job.submit(  

job => job,  

what => 'pb_clear_epay_1(180,300);',   

interval => 'trunc(sysdate + 1) + 65/(24*60)' 

);  

end;

/寫成sql檔案,在命令列裡執行即可,sql視窗也可以執行;

然後執行select * from user_jobs;檢視你剛生成的定時任務,next_date加next_sec就是下次執行時間,job是定時任務的id,

手動執行一次定時任務sql如下:

begin

dbms_job.run(28);--28是id

end;

刪除定時任務是:

begin

dbms_job.remove(28);

dbms_job.remove(29);--可以刪除多個

dbms_job.remove(30);

commit;

end;

停止乙個定時任務:

begin   

dbms_job.broken(31,true,sysdate);        /*停止乙個job,jobid, job的id,裡面引數true也可是false,next_date(某一時刻停止)也可是sysdate(立刻停止)。   */

dbms_job.broken(32,true,sysdate);

dbms_job.broken(33,true,sysdate);

commit;

end;

停止後nest_date是4000/1/1;

Oracle資料遷移

不同版本的oracle資料庫間資料的遷移,通常oracle資料庫的資料遷移會以dmp的方式或sql指令碼的方式,更多的會用dmp的方式,進行資料的匯入和匯出。如果不同版本的資料遷移的時候就出現問題了,在高版本中利用exp命令匯出資料,把匯出的dmp檔案,再利用低版本的imp命令來匯入,就出現了錯誤,...

oracle 資料遷移

由於系統公升級對資料庫表進行了修改,需要將原來庫中的資料遷移到新庫中。其遷移步驟如下 1 匯出源庫資料 exp 命令 2 由於新庫編碼格式為utf 8 源庫為 gbk 所以 新建乙個庫 將源庫資料匯入 imp 命令 3 在新庫中建立 dblink create database link creat...

oracle資料遷移

系統在安裝oracle時設定的system sys等使用者更改密碼 登入sqlplus nolog 連線資料庫 connect as sysdba 修改使用者密碼 例 修改sys使用者密碼為123 alter user sys identified by 123 查詢表空間路徑 select fro...