2017-04-26 75 views
0

我想寫一些字符串到一個txt文件,但它告訴我,V_OUT_FILE必須聲明,但我已經在塊的聲明部分聲明它。有什麼建議麼? 下面是完整的塊:PLS-00201:標識符「V_OUT_FILE」必須聲明爲

CREATE OR REPLACE DIRECTORY CTEST AS 'C:\Users\myUser\Desktop'; 
GRANT WRITE ON DIRECTORY CTEST TO PUBLIC 

DECLARE 
    v_out_File UTL_FILE.FILE_TYPE; 
BEGIN 
    v_out_File := UTL_FILE.FOPEN('CTEST', 'IO.txt' , 'W'); 

    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is text file! \n'); 
    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is line 2! \n'); 
    UTL_FILE.FCLOSE(v_out_File); 
END; 
+0

你貼什麼執行確定。除了你正在嘗試寫入一個你只授予讀權限的目錄之外,這會拋出ORA-29289,除非你以該所有者的身份運行該塊(即SYS)。 –

+0

@AlexPoole我改成了寫,它仍然給出了同樣的異常 – Safwat

+1

如果我複製和粘貼成功完成後你再發布的代碼。要麼你正在運行不同的東西,要麼有別的你沒說過的東西。 (授予不在SQL \ * Plus中執行,因爲沒有分號,但是再次給出ORA-29289,而不是PLS-00201)。 –

回答

4

這個問題實際上是在GRANT語句的末尾缺少分號。這拋出了一個你沒有提到的ORA-00933。由於該聲明沒有正確結束,DECLARE一切直到第一個分號,在聲明的最後,被視爲該授權,你可以在錯誤報告中看到(從SQL Developer)中的一部分:

Directory CTEST created. 


Error starting at line : 2 in command - 
GRANT WRITE ON DIRECTORY CTEST TO PUBLIC 

DECLARE 
    v_out_File UTL_FILE.FILE_TYPE 
Error report - 
ORA-00933: SQL command not properly ended 
00933. 00000 - "SQL command not properly ended" 
*Cause:  
*Action: 

這意味着就編譯器而言,嵌套語句從BEGIN開始,實際上必須是DECLARE節。這再次顯示真實的錯誤報告:

Error starting at line : 6 in command - 
BEGIN 
    v_out_File := UTL_FILE.FOPEN('CTEST', 'IO.txt' , 'W'); 

    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is text file! \n'); 
    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is line 2! \n'); 
    UTL_FILE.FCLOSE(v_out_File); 
END; 
Error report - 
ORA-06550: line 2, column 3: 
PLS-00201: identifier 'V_OUT_FILE' must be declared 
... 

如果您添加缺少的分號,然後它的工作原理:

CREATE OR REPLACE DIRECTORY CTEST AS 'C:\Users\myUser\Desktop'; 
GRANT WRITE ON DIRECTORY CTEST TO PUBLIC; 

DECLARE 
    v_out_File UTL_FILE.FILE_TYPE; 
BEGIN 
    v_out_File := UTL_FILE.FOPEN('CTEST', 'IO.txt' , 'W'); 

    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is text file! \n'); 
    UTL_FILE.PUT_LINE(v_out_File , 'Hi this is line 2! \n'); 
    UTL_FILE.FCLOSE(v_out_File); 
END; 
/

它得到

Directory CTEST created. 


Grant succeeded. 


PL/SQL procedure successfully completed. 
+0

偉大的答案ü解決了這個問題,但我可以」訪問Windows文件系統中的任何目錄,你能幫忙嗎? – Safwat

+0

我在Windows上做的不多。我懷疑Oracle服務正在運行的憑據無法訪問您的個人主目錄的桌面文件夾。你可以改變它到一個更公共的文件夾,看看它是否更快樂? –

+0

我試圖在d驅動器訪問文件夾,但我的訪問被拒絕過 – Safwat