這個問題實際上是在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)。 –