李威 さぽている

          小說翻譯,日語相關(guān)轉(zhuǎn)移至http://blog.hjenglish.com/liwei

          UTL_FILE使用配置篇


          以前曾寫過PL/SQL,當時還是第一次接觸,什么都不明白
          順手寫了篇 《Oracle內(nèi)建包UTL_FILE使用說明 》的博文,沒想到還被轉(zhuǎn)載(譬如百度搜索utl_file,第一篇就是,不過沒寫我的出處,可惜……)
          http://www.aygfsteel.com/liwei/archive/2007/01/10/92902.html

          當時項目做完就沒接觸PL/SQL了,時隔2年半,又要寫PL/SQL了,而且遇到的問題居然還是和UTL_FILE有關(guān)。
          于是上網(wǎng)找了些資料
          http://www.shift-the-oracle.com/plsql/utl_file/utl_file_dir.html
          http://www.shift-the-oracle.com/plsql/utl_file/create-directory.html
          日文的,不得不說,日本人做事實在是認真,資料非常詳細,看完之后,我就覺得我是高手了,可以整理點東西出來教別人了……哈哈
          廢話少說,開始

          現(xiàn)在一般跑UTL_FILE.FOPEN時會出現(xiàn)ORA-29280的錯誤,出現(xiàn)這個錯誤主要有2個原因
          1.文件夾沒有讀寫權(quán)限
          2.文件夾沒有進行Oracle讀寫配置

          注意:這里討論的Oracle是在Unix類(包括linux,Solaris等)主機下安裝的。

          對于第1個原因,直接設(shè)定文件夾權(quán)限即可,譬如
          # chmod 700 /u05/file_storage/recv_dir
          這個沒啥好說,不是我要說的重點。
          第2個原因,可以好好說說。
          Oracle進行文件夾讀寫配置有2種方式
          1.設(shè)定UTL_FILE_DIR
          2.使用DIRECTORY 對象

          1.設(shè)定UTL_FILE_DIR
          Oracle 8i之前,貌似沒有DIRECTORY這個概念,所以只有一種方式。
          編輯 initORACLE_SID.ora 文件(ORACLE_SID是個變數(shù),因DB設(shè)定有所不同),添加
          UTL_FILE_DIR='/u05/file_storage/recv_dir','/u05/file_storage/send_dir'
          即可。
          Oracle 9i之后還可以利用ALTER SYSTEM 命令進行設(shè)定
          ALTER SYSTEM SET
            UTL_FILE_DIR='/u05/file_storage/recv_dir','/u05/file_storage/send_dir'
          SCOPE = SPFILE ;
          也可以用命令來確認設(shè)定是否正確
          SELECT NAME, VALUE FROM V$PARAMETER2 WHERE NAME='utl_file_dir' ;

          注意:Oracle 8i 之后的DB不推薦使用這種方式,主要是情報泄露方面,日本很在意這個。
          另外,讓所有文件夾有效可使用('*')。
          這種方法不方便的就是,設(shè)定了之后必須重啟Oracle才能使設(shè)定有效。


          使用例

          CREATE OR REPLACE PROCEDURE RIVUS.UTL_FILE_DIR_WRITE_SAMPLE
          AS
           vHandle  UTL_FILE.FILE_TYPE;
           vDirname VARCHAR2(250);
           vFilename VARCHAR2(250);
           vOutput  VARCHAR2(32767);
          BEGIN
           vDirname := '/u05/file_storage/send_dir';   -- 絕對路徑
           vFilename := 'test.txt';
           vHandle := UTL_FILE.FOPEN(vDirname ,vFilename,'w', 32767);
           
           vOutput := '利用 UTL_FILE_DIR 進行的文件處理';
           UTL_FILE.PUT_LINE(vHandle, vOutput);
           UTL_FILE.FCLOSE(vHandle);
          EXCEPTION WHEN OTHERS THEN
           UTL_FILE.FCLOSE_ALL;
           RAISE;
          END;

          2.使用DIRECTORY 對象
          從Oracle 9i 開始UTL_FILE就能使用CREATE DIRECTORY了。
          首先文件夾必須存在,要有權(quán)限,我就不多說了。
          然后做成DIRECTORY 對象
          CREATE DIRECTORY recv_area AS '/u05/file_storage/recv_dir';
          CREATE DIRECTORY send_area AS '/u05/file_storage/send_dir';

          當recv_area已存在時,會出錯,可使用下面這句
          CREATE OR REPLACE DIRECTORY recv_area AS '/u05/file_storage/recv_dir';

          接著,賦予用戶該DIRECTORY 對象的讀寫權(quán)限
          GRANT READ ON DIRECTORY recv_area TO user_name ;
          GRANT WRITE ON DIRECTORY send_area TO user_name ;

          同時讀寫權(quán)限
          GRANT READ,WRITE ON DIRECTORY recv_area TO user_name ;

          做好這些就可以確認了
          SELECT * FROM ALL_DIRECTORIES ;
          看到自己做成的DIRECTORY了吧
          這里需要注意的是,當初CREATE DIRECTORY的時候是小寫recv_area,現(xiàn)在這里是大寫RECV_AREA
          之后利用該DIRECTORY 對象時必須用大寫。
          還有,該DIRECTORY對象不包括上層目錄(這個是當然的),也不包括子目錄。
          要利用子目錄需要再定義一個子目錄的DIRECTORY對象。

          使用例

          CREATE OR REPLACE PROCEDURE RIVUS.CREATE_DIR_WRITE_SAMPLE
          AS
           vHandle  UTL_FILE.FILE_TYPE;
           vDirname VARCHAR2(250);
           vFilename VARCHAR2(250);
           vOutput  VARCHAR2(32767);
          BEGIN
           vDirname := 'SEND_AREA';   -- 必須用大寫
           vFilename := 'test.txt';
           vHandle := UTL_FILE.FOPEN(vDirname ,vFilename,'w', 32767);
           
           vOutput := '利用CREATE DIRECTORY進行的文件處理';
           UTL_FILE.PUT_LINE(vHandle, vOutput);
           UTL_FILE.FCLOSE(vHandle);
          EXCEPTION WHEN OTHERS THEN
           UTL_FILE.FCLOSE_ALL;
           RAISE;
          END;

          到此為止,問題應(yīng)該解決了。

          posted on 2009-12-17 19:10 李威 閱讀(772) 評論(1)  編輯  收藏

          評論

          # re: UTL_FILE使用配置篇 2010-01-26 00:15 zhaogaifang

          李威,你太強了!我找了一晚上,終于在你這找到解決方法了,太感激了!  回復  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 白朗县| 仙居县| 株洲市| 天全县| 湄潭县| 侯马市| 尚志市| 江川县| 淳化县| 洞头县| 东方市| 大悟县| 上虞市| 集贤县| 思茅市| 平顶山市| 康定县| 昌邑市| 鲁山县| 大余县| 大安市| 宽甸| 克山县| 黑山县| 南华县| 上饶市| 华宁县| 探索| 始兴县| 中宁县| 嘉祥县| 尖扎县| 通河县| 怀化市| 荣昌县| 金川县| 巴中市| 麟游县| 兴义市| 武宁县| 潜山县|