2012-11-28 178 views
1

嗨,我運行Oracle 11,我試圖寫上使用UTL_FILE.FOPEN服務器框中的目錄。ORACLE 11G UTL_FILE + UTL_FILE_DIR - 無效目錄

爲了測試這一點,我使用下面的腳本(包括輸出):

SQL> @D:\test.sql 

declare 

l_file_handle    UTL_FILE.FILE_TYPE; 

begin 
    l_file_handle := UTL_FILE.FOPEN('/appl/mydir', 
            '/appl/mydir/filename', 
            'W'); 

    UTL_FILE.FCLOSE(l_file_handle); 

    DBMS_OUTPUT.PUT_LINE('FINISHED'); 

end; 

ORA-29280: invalid directory path 
ORA-06512: at "SYS.UTL_FILE", line 41 
ORA-06512: at "SYS.UTL_FILE", line 478 
ORA-06512: at line 7 

SQL> 

我已在/申請/ MYDIR加到UTL_FILE參數:

SELECT value 
FROM V$PARAMETER 
WHERE NAME = 'utl_file_dir'; 

/appl/mydir, /appl/mydir2, /appl/mydir3 

的UNIX目錄是可寫在UNIX上:

$ ls -l /appl/mydir 
total 0 
drwxrwsrwx 2 user userc 363968 Nov 27 13:46 mydir 

使用oracle目錄對象不是一個選項,我意識到使用UTL_FILE_DIR實現的缺點。

任何想法,爲什麼上面的腳本失敗的原因?

+0

http://docs.oracle.com/cd/E11882_01/appdev.112/e10577/u_file.htm#i1003526 - 您上面的內容似乎完全不符合文檔。 – Mat

+0

@Mat:以什麼方式?上面的代碼應該是有效的,並且可以在另一個Oracle 9環境中使用。 –

+0

請記住,oracle用戶(即數據庫正在運行的用戶)需要在目錄上執行讀/寫/執行操作才能到達並寫入文件。 oracle用戶至少有r + x on/appl? – DazzaL

回答

5

第一,在11g的首選方法是創建一個目錄,並且不使用UTL_FILE。

其次,請確認您用來設置directoty名單什麼確切的命令:

SELECT value 
FROM V$PARAMETER 
WHERE NAME = 'utl_file_dir'; 

/appl/mydir, /appl/mydir2, /appl/mydir3 

是它

alter system set utl_file_dir='/appl/mydir, /appl/mydir2, /appl/mydir3' scope = spfile; 

alter system set utl_file_dir='/appl/mydir','/appl/mydir2','/appl/mydir3' scope = spfile; 

如果第一種方式,重做再次二號方式,第一種方式是錯誤的(它看起來在v $表輸出相同,但其錯誤)。

如:

declare 
    2 
l_file_handle    UTL_FILE.FILE_TYPE; 
    4 
begin 
    l_file_handle := UTL_FILE.FOPEN('/tmp/foo/a', 
            '/tmp/foo/a/filename.txt', 
            'w'); 
    9 
    UTL_FILE.FCLOSE(l_file_handle); 
11 
    DBMS_OUTPUT.PUT_LINE('FINISHED'); 
13 
end; 
15/
declare 
* 
ERROR at line 1: 
ORA-29280: invalid directory path 
ORA-06512: at "SYS.UTL_FILE", line 41 
ORA-06512: at "SYS.UTL_FILE", line 478 
ORA-06512: at line 6 


SQL> show parameter utl_fil 

NAME      TYPE VALUE 
------------------------------------ ----------- ------------------------------ 
utl_file_dir     string /tmp/foo, /tmp/foo/a 

姆。現在讓我們修復這些數據。

SQL> alter system set utl_file_dir='/tmp/foo','/tmp/foo/a' scope = spfile; 

System altered. 

SQL> shutdown immediate 
Database closed. 
Database dismounted. 
ORACLE instance shut down. 
SQL> startup open 
ORACLE instance started. 

Total System Global Area 263049216 bytes 
Fixed Size   2225584 bytes 
Variable Size   176163408 bytes 
Database Buffers  79691776 bytes 
Redo Buffers   4968448 bytes 
Database mounted. 
Database opened. 
declare 
    2 
l_file_handle    UTL_FILE.FILE_TYPE; 
    4 
begin 
    l_file_handle := UTL_FILE.FOPEN('/tmp/foo/a', 
            '/tmp/foo/a/filename.txt', 
            'w'); 
    9 
    UTL_FILE.FCLOSE(l_file_handle); 
11 
    DBMS_OUTPUT.PUT_LINE('FINISHED'); 
13 
end; 
15/

PL/SQL procedure successfully completed. 

SQL> show parameter utl_file 

NAME      TYPE VALUE 
------------------------------------ ----------- ------------------------------ 
utl_file_dir     string /tmp/foo, /tmp/foo/a 
SQL> 

也驗證Oracle用戶R + X亮/申請和RWX上/申請/ MYDIR

+0

看起來像這樣。參數設置錯誤。很好的一個Dazzal。謝謝。 –

+0

拯救我的一天:)。 – MinhD

0

2個克服這種錯誤::解決步驟

1.Be確保OS級用戶有權限寫入到一個文件夾

2.Try大寫字母目錄名,即代替out_dir使用OUT_DIR

+0

試過大寫,它仍然無法正常工作。你知道我將如何檢查操作系統級別的用戶是否有權限。目標目錄是777.這是否意味着所有人都可寫? –

+0

該文件是否具有寫入權限? –

-1

對於文件名放在只是名字而不是路徑。 所以你應該把

declare 

l_file_handle    UTL_FILE.FILE_TYPE; 

begin 
    l_file_handle := UTL_FILE.FOPEN('/appl/mydir', 
            ',filename', 
            'W'); 

    UTL_FILE.FCLOSE(l_file_handle); 

    DBMS_OUTPUT.PUT_LINE('FINISHED'); 

end; 
0

空間不足也可能導致這個問題。

甲骨文拋出同樣的錯誤,如果你沒有對掛載點的空間。

ORA-29280: invalid directory path ORA-06512: at "SYS.UTL_FILE", line 41

請檢查utl_file_dir掛載點上的空間是否可用。

對於Linux &的Solaris使用:

df -k ${UTIL_FILE_PATH} 

我面臨同樣的問題,後來才知道,那是在安裝點的空間問題。