使用Oracle的儲存過程匯出某張表的資料到文字
使用Oracle的儲存過程匯出某張表的資料到文字
前言
某天接到一個小需求,匯出oracle某張表的資料到文字,要求表的資料結構未知(其實想多張表匯出哈),如果不考慮效率、匯出一張表還是很容易的,寫一條sql差不多就行了,所以想到了用utl_file寫個儲存過程實現,網上百度了一下並沒有直觀的參考資料,於是決定將自己整理的乾貨程式碼分享給大家。
上程式碼:
圖片版(為了手機上更好的閱讀提供了圖片版)
使用Oracle的儲存過程匯出某張表的資料到文字
程式碼版(手機排版亂但可以直接貼上做測試)
createorreplaceprocedure dump_data_to_file(tbName invarchar2,
p_code out integer,
p_err out varchar2) is
outfile utl_file。file_type;
v_col varchar2(4000);
v_sql varchar2(4000);
row_result varchar2(4000);
c1 sys_refcursor;
begin
for c_col in (select column_name from user_tab_columns where table_name=tbName order by column_id)
——for循環遊標,列名和等號“=”後面可以使用變數,但是sql本體無法使用變數,即無法使用動態sql,想用的話得使用open for遊標語法。
loop
v_col:=v_col||‘||chr(44)||’||c_col。column_name; ——輸出列名,chr(44)為逗號的ascii碼
end loop;
v_sql := ‘select ’||substr(v_col,12)||‘ from ’||tbName; ——輸出sql的字串,用substr函式格式化輸出,v_tab變數在這裡帶入,控制表名
outfile := utl_file。fopen(‘UTL_EXP_TEST’,tbName||‘。sql’,‘w’); //UTL_EXP_TEST : 定義好的目錄
open c1 for v_sql;
loop
fetch c1 into row_result;
exit when c1%notfound;
utl_file。put_line(outfile,row_result);
end loop;
close c1;
utl_file。fclose(outfile);
exception
when others then
p_code := sqlcode;
p_err := sqlerrm;
end dump_data_to_file;
測試
需要輸入想要匯出的tbName表名即可, 後續可以改進匯出所有表或指定多張表匯出(需要自己動手嘗試哈~,本次只是拋磚引玉)。
感言
方式千千萬,分享給需要的童鞋們,共勉~~~