日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出

發布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用utl_file包進行表數據導出

2013/11/12

一、概述

工作中需要將許多表的數據導出到一份excel中,雖然PL/SQL自帶有導出的功能,但是導出后需要進行手動的匯總到一張excel中,比較耗時。此時就可以利用oracle自帶的utl_file包完成此工作。它可以將不同表的相關數據導出到一張excel里,省去了后續的工作。

------------------------------------------------------------------------------------

二、實驗步驟

1.導入utl_file包。

以sys用戶在command窗口執行如下SQL腳本即可。

utlfile.sql

2.建立文件導出目錄并賦予讀寫權限

create or replace directory data_out as 'd:\';

grant read ,write on directory data_out to scott;

3.對scott用戶賦予執行utl_file包的權限。

grant execute on utl_file to scott;

4.修改utl_file_dir參數,此參數為靜態參數,然后重啟數據庫。

alter system set utl_file_dir = 'd:\' scope = spfile;

5.創建存儲過程進行表數據導出

create or replace procedure

export_2_excel(pfile_name?in varchar2,

--輸出文件名

pexport_sql in varchar2) --執行的sql語句 ‘select

empno||chr(9),ename||chr(9) from emp’

--chr(9)是制表符。

as

--存儲記錄的對象類型

type content_record_type is record(

empno

varchar2(25),

ename

varchar2(25),

job?varchar2(25),

sal?varchar2(25));

content_re content_record_type;

--建立游標

type cur_content is ref cursor;

c_content cur_content;

l_file utl_file.file_type; --建立操作文件的句柄

begin

l_file := utl_file.fopen('d:\', pfile_name ||

'.xls', 'w'); --打開文件'

utl_file.put_line(l_file,

'empno' || chr(9) || 'ename' || chr(9) || 'job' ||

chr(9) || 'sal'); --輸出標頭

open c_content for pexport_sql; --打開游標

loop

fetch

c_content

into content_re.empno,

content_re.ename,

content_re.job,

content_re.sal;

exit when

c_content%notfound;

utl_file.put(l_file, content_re.empno);

utl_file.put(l_file, content_re.ename);

utl_file.put(l_file, content_re.job);

utl_file.put_line(l_file, content_re.sal);

end loop;

close c_content;

UTL_FILE.FFLUSH (l_file);--確保緩存已經寫入文件。

utl_file.fclose(l_file); --關閉句柄,一定不能忘!!!

end;

----------------------------------------------------------

附:utl_file包的介紹

utl_file包的應用是非常廣泛的,而且也很實用,應為Oracle雖然有SQL*Loader可以將文本的內容讀到數據庫里,?但是不能將數據庫內容輸出到文本。所以基本上是要用到utl_file包來操作。先看了一下Oracle官方文檔中的介紹,?utl_file推薦直接使用自己創建的DIRECTORY來操作文件,而不要繼續使用UTL_FILE_DIR包來指定。utl_file包的?工作機制是這樣的:首先要使用FOPEN函數,將文件的路徑、文件名、以及打開模式的參數傳入,然后Oracle會到?ALL_DIRECTORIES視圖中查看路徑是否已經創建。如果路徑和文件名均合法,則該文件被打開到一個file_type中,?然后可以進行各種操作,最后使用FCLOSE函數將其關閉。具體了解包可以查看utlfile.sql里面的內容,這里僅列舉?一下常用過程和函數。

FOPEN

,?IS_OPEN?,?GET_LINE?,?PUT?,?NEW_LINE?,

PUT_LINE?,?PUTF?,?FFLUSH?,?FCLOSE?,?FCLOSE_ALL 。

---------------------------------------------------------------

1.UTL_FILE.FOPEN

--FOPEN會打開指定文件并返回一個文件句柄用于操作文件。

FUNCTION UTL_FILE.FOPEN

(?location?IN VARCHAR2,?--輸出文件地址?filename?IN VARCHAR2,?--輸出文件名?open_mode?IN

VARCHAR2,?--打開文件的模式?max_linesize IN BINARY_INTEGER DEFAULT NULL

--文件每行最大的字符數,包括換行符。最小為1,最大為32767

)?RETURN

file_type;?3種文件打開模式:

R 只讀模式。一般配合UTL_FILE的GET_LINE來讀文件。

W 寫(替換)模式。文件的所有行會被刪除。PUT, PUT_LINE, NEW_LINE,

PUTF和FFLUSH都可使用。

A 寫(附加)模式。原文件的所有行會被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE,

PUTF和FFLUSH都可使用。

2.UTL_FILE.IS_OPEN

--如果文件句柄指定的文件已打開,返回TRUE,否則FALSE

FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE--文件句柄

)

RETURN BOOLEAN;

3.UTL_FILE.GET_LINE

--UTL_FILE只提供一個方法去讀取數據:GET_LINE

讀取指定文件的一行到提供的緩存。

PROCEDURE

UTL_FILE.GET_LINE(file?IN?UTL_FILE.FILE_TYPE, --文件句柄

buffer OUT VARCHAR2,--存放緩存,行終止符不會被傳進buffer

len?IN BINARY_INTEGER DEFAULT NULL);

4.UTL_FILE.PUT

--在當前行輸出數據

--UTL_FILE.PUT輸出數據時不會附加行終止符。

PROCEDURE UTL_FILE.PUT(file?IN

UTL_FILE.FILE_TYPE, --文件句柄

buffer OUT VARCHAR2);--要寫入的數據緩存

5.UTL_FILE.NEW_LINE

--在當前位置輸出新行或行終止符,使用UTL_FILE.PUT必須使用NEW_LINE來結束當前行。

--但可以使用PUT_LINE輸出帶有行終止符的完整行數據。

PROCEDURE UTL_FILE.NEW_LINE(file IN UTL_FILE.FILE_TYPE,

--文件句柄

lines IN NATURAL := 1); --要插入的行數,默認為1行

6.UTL_FILE.PUT_LINE

--輸出一個字符串以及一個與系統有關的行終止符。

--PUT_LINE相當于PUT后加上NEW_LINE;也相當于PUTF的格式串"%s/n"。

PROCEDURE UTL_FILE.PUT_LINE

(file?IN UTL_FILE.FILE_TYPE,

--文件句柄

buffer IN VARCHAR2);--寫入文件的數據緩存

7.UTL_FILE.PUTF

以一個模版樣式輸出至多5個字符串,類似C中的printf

PROCEDURE UTL_FILE.PUTF(file?IN

FILE_TYPE,--文件句柄

format IN VARCHAR2,--格式串

arg1?IN VARCHAR2 DEFAULT

NULL,--可選參數,一共5個

arg2?IN VARCHAR2 DEFAULT NULL,

arg3?IN VARCHAR2 DEFAULT NULL,

arg4?IN

VARCHAR2 DEFAULT NULL,

arg5?IN

VARCHAR2 DEFAULT NULL);

格式串可使用以下樣式

%s

在格式串中可以使用最多5個%s,與后面的5個參數一一對應

/n

換行符。在格式串中沒有個數限制

%s會被后面的參數依次填充,如果沒有足夠的參數,%s會被忽視,不被寫入文件

8.UTL_FILE.FFLUSH

--確保所有數據寫入文件。

--操作系統可能會緩存數據來提高性能。因此可能調用put后,打開文件卻看不到寫入的數據。

--在關閉文件前要讀取數據的話可以使用UTL_FILE.FFLUSH。

PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);

9.UTL_FILE.FCLOSE

--關閉文件

PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);

10.UTL_FILE.FCLOSE_ALL

--關閉所有已打開的文件

PROCEDURE UTL_FILE.FCLOSE_ALL;

在結束程序時要確保所有打開的文件已關閉,可使用FCLOSE_ALL。

總結

以上是生活随笔為你收集整理的oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。