这个问题实际上是在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.
你贴什么执行确定。除了你正在尝试写入一个你只授予读权限的目录之外,这会抛出ORA-29289,除非你以该所有者的身份运行该块(即SYS)。 –
@AlexPoole我改成了写,它仍然给出了同样的异常 – Safwat
如果我复制和粘贴成功完成后你再发布的代码。要么你正在运行不同的东西,要么有别的你没说过的东西。 (授予不在SQL \ * Plus中执行,因为没有分号,但是再次给出ORA-29289,而不是PLS-00201)。 –