日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/20 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

利用utl_file包進(jìn)行表數(shù)據(jù)導(dǎo)出

2013/11/12

一、概述

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

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

二、實(shí)驗(yàn)步驟

1.導(dǎo)入utl_file包。

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

utlfile.sql

2.建立文件導(dǎo)出目錄并賦予讀寫權(quán)限

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

grant read ,write on directory data_out to scott;

3.對(duì)scott用戶賦予執(zhí)行utl_file包的權(quán)限。

grant execute on utl_file to scott;

4.修改utl_file_dir參數(shù),此參數(shù)為靜態(tài)參數(shù),然后重啟數(shù)據(jù)庫(kù)。

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

5.創(chuàng)建存儲(chǔ)過(guò)程進(jìn)行表數(shù)據(jù)導(dǎo)出

create or replace procedure

export_2_excel(pfile_name?in varchar2,

--輸出文件名

pexport_sql in varchar2) --執(zhí)行的sql語(yǔ)句 ‘select

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

--chr(9)是制表符。

as

--存儲(chǔ)記錄的對(duì)象類型

type content_record_type is record(

empno

varchar2(25),

ename

varchar2(25),

job?varchar2(25),

sal?varchar2(25));

content_re content_record_type;

--建立游標(biāo)

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'); --輸出標(biāo)頭

open c_content for pexport_sql; --打開游標(biāo)

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);--確保緩存已經(jīng)寫入文件。

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

end;

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

附:utl_file包的介紹

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

FOPEN

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

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

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

1.UTL_FILE.FOPEN

--FOPEN會(huì)打開指定文件并返回一個(gè)文件句柄用于操作文件。

FUNCTION UTL_FILE.FOPEN

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

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

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

)?RETURN

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

R 只讀模式。一般配合UTL_FILE的GET_LINE來(lái)讀文件。

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

PUTF和FFLUSH都可使用。

A 寫(附加)模式。原文件的所有行會(huì)被保留。在最末尾行附加新行。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只提供一個(gè)方法去讀取數(shù)據(jù):GET_LINE

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

PROCEDURE

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

buffer OUT VARCHAR2,--存放緩存,行終止符不會(huì)被傳進(jìn)buffer

len?IN BINARY_INTEGER DEFAULT NULL);

4.UTL_FILE.PUT

--在當(dāng)前行輸出數(shù)據(jù)

--UTL_FILE.PUT輸出數(shù)據(jù)時(shí)不會(huì)附加行終止符。

PROCEDURE UTL_FILE.PUT(file?IN

UTL_FILE.FILE_TYPE, --文件句柄

buffer OUT VARCHAR2);--要寫入的數(shù)據(jù)緩存

5.UTL_FILE.NEW_LINE

--在當(dāng)前位置輸出新行或行終止符,使用UTL_FILE.PUT必須使用NEW_LINE來(lái)結(jié)束當(dāng)前行。

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

PROCEDURE UTL_FILE.NEW_LINE(file IN UTL_FILE.FILE_TYPE,

--文件句柄

lines IN NATURAL := 1); --要插入的行數(shù),默認(rèn)為1行

6.UTL_FILE.PUT_LINE

--輸出一個(gè)字符串以及一個(gè)與系統(tǒng)有關(guān)的行終止符。

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

PROCEDURE UTL_FILE.PUT_LINE

(file?IN UTL_FILE.FILE_TYPE,

--文件句柄

buffer IN VARCHAR2);--寫入文件的數(shù)據(jù)緩存

7.UTL_FILE.PUTF

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

PROCEDURE UTL_FILE.PUTF(file?IN

FILE_TYPE,--文件句柄

format IN VARCHAR2,--格式串

arg1?IN VARCHAR2 DEFAULT

NULL,--可選參數(shù),一共5個(gè)

arg2?IN VARCHAR2 DEFAULT NULL,

arg3?IN VARCHAR2 DEFAULT NULL,

arg4?IN

VARCHAR2 DEFAULT NULL,

arg5?IN

VARCHAR2 DEFAULT NULL);

格式串可使用以下樣式

%s

在格式串中可以使用最多5個(gè)%s,與后面的5個(gè)參數(shù)一一對(duì)應(yīng)

/n

換行符。在格式串中沒(méi)有個(gè)數(shù)限制

%s會(huì)被后面的參數(shù)依次填充,如果沒(méi)有足夠的參數(shù),%s會(huì)被忽視,不被寫入文件

8.UTL_FILE.FFLUSH

--確保所有數(shù)據(jù)寫入文件。

--操作系統(tǒng)可能會(huì)緩存數(shù)據(jù)來(lái)提高性能。因此可能調(diào)用put后,打開文件卻看不到寫入的數(shù)據(jù)。

--在關(guān)閉文件前要讀取數(shù)據(jù)的話可以使用UTL_FILE.FFLUSH。

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

9.UTL_FILE.FCLOSE

--關(guān)閉文件

PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);

10.UTL_FILE.FCLOSE_ALL

--關(guān)閉所有已打開的文件

PROCEDURE UTL_FILE.FCLOSE_ALL;

在結(jié)束程序時(shí)要確保所有打開的文件已關(guān)閉,可使用FCLOSE_ALL。

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。