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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 导出数据 utl,使用utl_file做选择性数据导出

發(fā)布時(shí)間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 导出数据 utl,使用utl_file做选择性数据导出 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在平時(shí)的數(shù)據(jù)導(dǎo)出中使用exp/expdp能夠滿足絕大部分的數(shù)據(jù)導(dǎo)出任務(wù)。如果有一些表的數(shù)據(jù)不多,但是查詢條件要復(fù)雜一些,使用exp/expdp就很吃力了。

或者在和外部系統(tǒng)的交互中,使用xml或者文本文件是一個(gè)很兼容的選擇,這個(gè)時(shí)候使用exp/expdp也滿足不了要求。

這個(gè)時(shí)候可以考慮使用utl_file的提供的一些功能來做選擇性的數(shù)據(jù)導(dǎo)出。

先來使用utl_file做一個(gè)簡單的例子,輸出兩行文本內(nèi)容到output.txt文件中。一行Hello,一行hello word

declare

v_filehandle UTL_FILE.FILE_TYPE;

begin

v_filehandle:=utl_file.fopen('/u01/ora11g/test/test','output.txt','w');

UTL_FILE.PUTF (v_filehandle,' REPORT: GENERATED ON%s\n', SYSDATE);

UTL_FILE.NEW_LINE (v_filehandle);

UTL_FILE.PUTF (v_filehandle, '%s\n','hello ');

UTL_FILE.PUTF (v_filehandle, 'hello: %s\n','world ');

UTL_FILE.FCLOSE (v_filehandle);

end;

/

運(yùn)行pl/sql之后的輸出如下:

[ora11g@rac1 test]$ cat output.txt

REPORT: GENERATED ON14-SEP-14

hello

hello: world

這個(gè)地方需要說明一下,我在??/u01/ora11g/test/test 輸出了文件output.txt,事先沒有創(chuàng)建任何的directory。因?yàn)閡tl_file_dir這個(gè)參數(shù)的默認(rèn)值是*

SQL> show parameter utl

NAME???????????????????????????????? TYPE??????? VALUE

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

create_stored_outlines?????????????? string

utl_file_dir???????????????????????? string????? *

我們來做一個(gè)更有實(shí)際意義的。

從表data中輸出100行數(shù)據(jù)到output.txt中。

declare

v_filehandle UTL_FILE.FILE_TYPE;

begin

v_filehandle:=utl_file.fopen('/u01/ora11g/test/test','output.txt','w');

UTL_FILE.PUTF (v_filehandle,'---export data from table data:', SYSTIMESTAMP);

UTL_FILE.NEW_LINE (v_filehandle);

for i in(select * from data where rownum<100) loop

UTL_FILE.PUTF (v_filehandle, '%s,%s\n',i.zhu,i.ke);

end loop;

UTL_FILE.FCLOSE (v_filehandle);

end;

/

輸出內(nèi)容如下,可以看到都是按照逗號分隔。顯示的情況還不錯(cuò)。

[ora11g@rac1 test]$ cat output.txt

---export data from table data:

0,2

2,1

1,2

1,0

3,1

0,1

0,3

2,2

6,2

1,0

0,2

0,0

3,0

1,0

1,2

0,1

因?yàn)閡tl_file在新版本中一直都是推薦使用directory來替代的,我們也可以使用directory對象來實(shí)現(xiàn)。黃色的部分TEST就是directory的名字,指向'/u01/ora11g/test/test'

declare

v_filehandle UTL_FILE.FILE_TYPE;

begin

v_filehandle:=utl_file.fopen('TEST','output.txt','w');

UTL_FILE.PUTF (v_filehandle,'---export data from table data:', SYSTIMESTAMP);

UTL_FILE.NEW_LINE (v_filehandle);

for i in(select * from data where rownum<100) loop

UTL_FILE.PUTF (v_filehandle, '%s,%s\n',i.zhu,i.ke);

end loop;

UTL_FILE.FCLOSE (v_filehandle);

end;

/

輸出的結(jié)果沒有任何變化。

有的人可能說是用spool也可以實(shí)現(xiàn),而且更靈活,在一定程度上是的,不過還是和utl_file有一定的區(qū)別。

比如我沒有設(shè)置NLS_LANG的變量值,在sqlplus中查看中文可能就有問題。但是系統(tǒng)層面沒有任何影響。

可以看到在sqlplus中顯示是亂碼的形式,但是在輸出文件中顯示的是正確的中文格式。

SQL> select *from test;

ID NAME

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

1 ??????

SQL> declare

2? v_filehandle UTL_FILE.FILE_TYPE;

3? begin

4? v_filehandle:=utl_file.fopen('/u01/ora11g/test/test','output.txt','w');

5? UTL_FILE.PUTF (v_filehandle,'---export data from table data:', SYSTIMESTAMP);

6? UTL_FILE.NEW_LINE (v_filehandle);

7? for i in(select * from test where rownum<100) loop

8? UTL_FILE.PUTF (v_filehandle, '%s,%s\n',i.id,i.name);

9? end loop;

10? UTL_FILE.FCLOSE (v_filehandle);

11? end;

12? /

PL/SQL procedure successfully completed.

SQL> host

[ora11g@rac1 test]$ cat output.txt

---export data from table data:

1,突破玩法界限

總結(jié)

以上是生活随笔為你收集整理的oracle 导出数据 utl,使用utl_file做选择性数据导出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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