最近老大要我做幾張流水表的資料遷移,要求每天定時清理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...