使用Oracle的儲存過程匯出某張表的資料到文字

使用Oracle的儲存過程匯出某張表的資料到文字

前言

某天接到一個小需求,匯出oracle某張表的資料到文字,要求表的資料結構未知(其實想多張表匯出哈),如果不考慮效率、匯出一張表還是很容易的,寫一條sql差不多就行了,所以想到了用utl_file寫個儲存過程實現,網上百度了一下並沒有直觀的參考資料,於是決定將自己整理的乾貨程式碼分享給大家。

上程式碼:

圖片版(為了手機上更好的閱讀提供了圖片版)

使用Oracle的儲存過程匯出某張表的資料到文字

使用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表名即可, 後續可以改進匯出所有表或指定多張表匯出(需要自己動手嘗試哈~,本次只是拋磚引玉)。

感言

方式千千萬,分享給需要的童鞋們,共勉~~~

使用Oracle的儲存過程匯出某張表的資料到文字