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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

oracle 根据分隔符提取,oracle使用指定分隔符导出数据到文件

發布時間:2024/7/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 根据分隔符提取,oracle使用指定分隔符导出数据到文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近有需求要導出一個專業的詳單,用于倒入sqlserver系統,要求用分隔符隔開各字段。一開始準備用toad查詢出來在save as,但發現表太多,要一張一張表盯著,而且由于詳單數據量大,查詢導出占用了大量的客戶端內存,其它活干不了了。后來想用||','||的方式間隔sql語句中的字段,這種方法雖然可以實現腳本導入,但由于數據量大,而sqlplus中pagesize畢竟有現在,文本中會出現分隔符等問題,清理起來很麻煩。最后搜到了一個比較不錯的方法,據說是tom寫的。下面介紹下簡單的方法。

首先,需要定義utl_file_dir

SQL> show parameter utl

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

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

utl_file_dir???????????????????????? string????? /oracle/script, /archivelog

這里系統以前就指定了/archivelog作為目錄(這個目錄雖然足夠很大,不過大文件盡量不要放在這里,比較危險,我這里空間緊張也沒有辦法),然后需要創建一個directory,方法很簡單:

CREATE OR REPLACE DIRECTORY UTLDIR AS?'/archivelog';

然后需要在查詢用戶下建個function了,這個function是解決這個問題的核心:

CREATE function dump_csv( p_query???? in varchar2,

p_separator in varchar2

default ',',

p_dir?????? in varchar2 ,

p_filename? in varchar2 )

return number

AUTHID CURRENT_USER

is

l_output??????? utl_file.file_type;

l_theCursor???? integer default dbms_sql.open_cursor;

l_columnValue?? varchar2(2000);

l_status??????? integer;

l_colCnt??????? number default 0;

l_separator???? varchar2(10) default '';

l_cnt?????????? number default 0;

begin

l_output := utl_file.fopen( p_dir, p_filename, 'w' );

dbms_sql.parse(? l_theCursor,? p_query, dbms_sql.native );

for i in 1 .. 255 loop

begin

dbms_sql.define_column( l_theCursor, i,

l_columnValue, 2000 );

l_colCnt := i;

exception

when others then

if ( sqlcode = -1007 ) then exit;

else

raise;

end if;

end;

end loop;

dbms_sql.define_column( l_theCursor, 1, l_columnValue,

2000 );

l_status := dbms_sql.execute(l_theCursor);

loop

exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );

l_separator := '';

for i in 1 .. l_colCnt loop

dbms_sql.column_value( l_theCursor, i,

l_columnValue );

utl_file.put( l_output, l_separator ||

l_columnValue );

l_separator := p_separator;

end loop;

utl_file.new_line( l_output );

l_cnt := l_cnt+1;

end loop;

dbms_sql.close_cursor(l_theCursor);

utl_file.fclose( l_output );

return l_cnt;

end dump_csv;

/

之后,只需要使用命令

SQL> select dump_csv('select * from TEST',',','/archivelog','emp.csv') from dual;

DUMP_CSV('SELECT*FROMTEST',',','/ARCHIVELOG','EMP.CSV')

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

3

查看/archivelog/emp.csv文件

1,1

2,2

4,4

這里要注意,查詢用戶必須有對directory的讀寫權限:

grant read, write on directory utldir to rongyu;

這個方法利用了utl_file和dbms_sql兩個過程,ps/sql本身的功能不容忽視啊。

不過這里我還存在一個疑問,對于utl_file.fopen的解釋,官方文檔是這樣描述的:

UTL_FILE.FOPEN (

location IN VARCHAR2,

filename IN VARCHAR2,

open_mode IN VARCHAR2,

max_linesize IN BINARY_INTEGER)

RETURN file_type;

Parameters

Table 95-3 FOPEN Function Parameters

Parameter

Description

location

Directory location of file.

filename

File name, including extension (file type), without directory path. In Unix, the filename cannot end with /.

open_mode

Specifies how the file is opened. Modes include:

r--read text

w--write text

a--append text

If you try to open a file that does not exist using a value for open_mode, then the file is created in write mode.

max_linesize

Maximum number of characters per line, including the newline character, for this file. (minimum value 1, maximum value 32767). The default is approximately 1000 bytes.

也就是說,例子里UTL_FILE.FOPEN中p_dir路徑應該是以文件目錄位置名作為導入變量,但有人說要指定directory才有效,這里我發現用utldir是無效的:

SQL> select dump_csv('select * from TEST',',','utldir','emp.csv') from dual;

select dump_csv('select * from TEST',',','utldir','emp.csv') from dual

*

ERROR at line 1:

ORA-29280: invalid directory path

ORA-06512: at "SYS.UTL_FILE", line 18

ORA-06512: at "SYS.UTL_FILE", line 424

ORA-06512: at "RONGYU.DUMP_CSV", line 17

ORA-06512: at line 1

不知道是不是版本問題造成的不同,還是其它什么原因,這里還需要打個問號先

總結

以上是生活随笔為你收集整理的oracle 根据分隔符提取,oracle使用指定分隔符导出数据到文件的全部內容,希望文章能夠幫你解決所遇到的問題。

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