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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用ORACLE生成文本文件

發布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用ORACLE生成文本文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、在使用ORACLE的存儲過程生成文件

在ORACLE中生成文件是比較方便的,尤其是生成對外接口的時候,通過定時任務完成,是一個非常直接的方法,而且比編譯式語言具有更加靈活的方式。

使用PL/SQL生成文件時需要使用到兩個東西:1.目錄對象,2.文件工具包

1. 目錄對象

目錄對象是通過在數據庫中建立一個對象,指向數據庫所有機器的目錄,注意不是本地目錄。如果數據庫在磁陣上,最好將文件放在磁陣上,這樣做雙機熱備的時候不至于出現問題。

添加目錄可以通過PL/SQL Developer或者其它可視化工具建立,也可以通過腳本來生成,腳本有如下形式:

-- Create directory create or replace directory BAS_BLACK_DATAas '/data/appdata/metadata/dispatch/bas';

2. 文件工具包 UTL_FILE

通過UTL_FILE包可以完成文件讀寫,以下是我摘過來的一個UTF_FILE.fopen函數的文檔。

這里注意一點,我這是10g版本下的,如果在9i下,不支持"wb", "rb“ ”ab"模式。

這意味著,不能使用二制式模式打開文件或者寫文件,一般在寫文件時,換行符就會與平臺相關,如果在LINUX下需要生成回車換行符,就得手工操作:

UTF_FILE.put_line(line||chr(13)); -- 通過加下chr(13) = 0x0D方式加入一個回車符,如果在windows平臺,會自動生成回車換行符。如果在WINDOWS上只想生成換行符,估計只能使用UTF_FILE.put方式手動寫入換行符chr(10)。

詳細參考可以通過在PL/SQL Developer上按Ctrl單擊包,去查看包源碼。

/*** FOPEN - open file**** As of 8.0.6, you can have a maximum of 50 files open simultaneously.**** As of 9.0.2, UTL_FILE allows file system access for directories** created as database objects. See the CREATE DIRECTORY command.** Directory object names are case sensitive and must match exactly** the NAME string in ALL_DIRECTORIES. The LOCATION parameter may be** either a directory string from the UTL_FILE_DIR init.ora parameter** or a directory object name.**** IN** location - directory location of file** filename - file name (including extention)** open_mode - open mode ('r', 'w', 'a' 'rb', 'wb', 'ab')** max_linesize - maximum number of characters per line, including the** newline character, for this file.** Valid values are 1 through 32767 and NULL. A NULL** value for max_linesize indicates that UTL_FILE should** calculate an operating system specific value at runtime.** RETURN** file_type handle to open file** EXCEPTIONS** invalid_path - file location or name was invalid** invalid_mode - the open_mode string was invalid** invalid_operation - file could not be opened as requested** invalid_maxlinesize - specified max_linesize is too large or too small** access_denied - access to the directory object is denied*/FUNCTION fopen(location IN VARCHAR2,filename IN VARCHAR2,open_mode IN VARCHAR2,max_linesize IN BINARY_INTEGER DEFAULT NULL)RETURN file_type;PRAGMA RESTRICT_REFERENCES(fopen, WNDS, RNDS, TRUST);

2、生成文件時注意事項

生成文件時,如果是生成定長字節的文件時,需要注意與字符集相關的函數,如果使用錯誤,將會直接給接口文件帶來問題,這可是我的教訓啊!

舉個例子:生成一行文本,要求限制在100個字節內。

如果我這么寫


utf_file.put_line(rpad(content, 100));

上面這樣子是不是就可以了呢?有沒有問題?

大多數情況下沒問題,但問題肯定有,如果查看rpad文件就會說明一點:

RPAD returns expr1, right-padded to lengthn characters with expr2, replicated as many times as necessary. This function is useful for formatting the output of a query.


The argument n is the total length of the return value as it is displayed on your terminal screen. In most character sets, this is also the number of characters in the return value. However, in some multibyte character sets, the display length of a character string can differ from the number of characters in the string.

這里的意思是說,該函數可以生成你指定的字符,而且這里的寬度一般是指在屏幕上顯示的寬度,在多字符集下就會有問題。所有我們如果想處理這個問題,就需要尋求一個取得字節數的函數,并使用如下方式生成:

utf_file.put_line(content||rpad(' ', 100-lengthb(content)));

3、與文本相關函數比較

上面講了,使用ORACLE生成文件時的注意事項,這里,再將相關的函數區別也列一下,只是需要特殊注意ORACLE中的NULL的處理問題,一般函數對于NULL返回NULL,所以如果生成文件的項為NULL就需要做特殊化處理,比如上面的輸出定長100的行時,如果content為空,那該行也為空。所以正確的方式是判斷字段的NULL否。

utf_file.put_line(decode(content, null, ' ', content)||rpad(' ', 100-lengthb(decode(content, null, ' ', content))));

1、length系列

The LENGTH functions return the length of char.LENGTH calculates length using characters as defined by the input character set.LENGTHB uses bytes instead of characters. LENGTHC uses Unicode complete characters.LENGTH2 uses UCS2 code points. LENGTH4 uses UCS4 code points.

如果想取得字節數,可以使用lengthb,如果使用UNICODE使用lengthc,如果使用UCS2使用length2,length4使用UCS4。

這里這么多字符集,其它只需要使用這些是相關標準,以及對應的字符寬度就可以了,而且這里的用語感覺也有點含糊。

相對于中文來講,在GBK字符集情況下,length返回1,lengthb返回2,

在UTF8字符集情況下,length返回1, lengthb返回3,這是因為UTF8編碼方式是這樣子的,其它UTF8編碼是UNICODE的一個編碼方案而已。


2、vsize函數

VSIZE returns the number of bytes in the internal representation ofexpr.?

以國際化呈現的方式返回字符串的字節數,這同樣與字符集相關。

如下地址:http://space.itpub.net/16179598/viewspace-663045 對漢字在ORACLE中長度進行一些比較和實驗,可以參考一下。


3、rpad函數

在前面已經說明了注意事項。


版權聲明:本文為博主原創文章,未經博主允許不得轉載。

轉載于:https://www.cnblogs.com/yin138/archive/2011/08/18/4902259.html

總結

以上是生活随笔為你收集整理的使用ORACLE生成文本文件的全部內容,希望文章能夠幫你解決所遇到的問題。

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