2013-02-13 102 views
0

我試圖執行這些行:無法寫入文件。甲骨文

DECLARE 
    V_FILEHANDLE UTL_FILE.FILE_TYPE; 
BEGIN 
    V_FILEHANDLE := UTL_FILE.FOPEN('C:\samples', '1.csv', 'w'); 
    UTL_FILE.PUT_LINE(V_FILEHANDLE, 'sample string'); 
    UTL_FILE.FCLOSE_ALL; 
END; 

此前我已經成功地執行這些語句:(?雖然我不能找到C:\驅動器上的目錄)

create directory sample as 'C:\samples'; 

但是這給了我等的輸出:

ORA-29280: 「無效的目錄路徑」

* 原因:相應的目錄對象不存在。

* 動作:更正目錄對象參數,或使用CREATE DIRECTORY命令創建相應的目錄對象。

而且我已經試過授予previleges到我的用戶名:

grant read, write on directory sample to brick; 

但是這給了我像

ORA-01749的輸出:你可能不賦予/撤消的特權/ from your

我在做什麼錯?

回答

1

替換

V_FILEHANDLE := UTL_FILE.FOPEN('C:\samples', '1.csv', 'w'); 

與:

V_FILEHANDLE := UTL_FILE.FOPEN('SAMPLE', '1.csv', 'w'); 

作爲indicated in the doc,將第一個參數是目錄對象


在舊版本的Oracle的UTL_FILE.openused to be the directory path的第一個參數,但由於引入了DIRECTORY對象的這個已被否決(9i中?)。

+0

完成。現在越來越ORA-29283錯誤。我應該授予誰權限? – lexeme 2013-02-13 14:18:41

+0

@brick服務器上的物理目錄是否存在?在Oracle中使用它之前,必須先從操作系統創建目錄。 – 2013-02-13 14:21:50

+0

我不知道這個,因爲你可能猜到) – lexeme 2013-02-13 14:22:01

0

謝謝SOOO很多!我發現我的錯誤。我創建像

create or REPLACE DIRECTORY dat_dir as '/u01/oracle/Desktop/Migration/Data';

然後我用它在我的UTL_FILE這樣

file1 := utl_file.fopen('dat_dir','output.txt','w');

我一直想這個爲工作目錄現在3天。我發現這個問題,因爲它在引號內,它是一個區分大小寫的字符串。如果最初我使用了dat_dir,則無關緊要,oracle會以大寫形式存儲這樣的內容。你簡單的回答幫助我意識到這一點,謝謝你一百萬次!

做正確的做法是:

file1 := utl_file.fopen('DAT_DIR','output.txt','w');