2017-04-26 41 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

相关问题