UTL_FILE.FOPEN ORA-20102:无效操作

时间:2017-10-09 02:35:10

标签: oracle plsql

我想使用UTL_FILE.FOPEN('MY_DIR','test.txt','W');

但是我收到以下错误:

  

ORA-20102:无效操作

我试图将READ和WRITE放在&_ 39; MY_DIR'像这样对公众:

GRANT READ ON DIRECTORY MY_DIR to public;

它什么都没改变!

我对MY_DIRchmod 777 /test_data)赋予了所有权利,结果相同。

1 个答案:

答案 0 :(得分:1)

您的服务器目录路径'MY_DIR'没有write权限,或者可能存在其他一些未知问题(因为您说您已经授予了777权限)。

使用Create directory命令在Oracle中创建目录时,会自动在READ上授予WRITEdirectory对象权限,您可以授予这些权限到其他usersroles。同样你可以检查如下。

SELECT * 
  FROM all_tab_privs 
 WHERE table_name = <Your directory>;  --> You would see that all the priv is there and still you cannot open the file.

见下面的演示:

SQL> create or replace  directory  BDUMP as '/app/home/user/fil_test/';

Directory created.

SQL> SELECT * 
  FROM all_tab_privs 
 WHERE table_name = 'BDUMP';     


SQL> /

GRANTOR              GRANTEE              TABLE_SCHEMA           TABLE_NAME            PRIVILEGE    GRA  HIE
------------------ ----------------  --------------- --------------- ------------------ --- ----    ---  ---
SYS                  USER                       SYS               BDUMP                 EXECUTE      YES NO
SYS                  USER                       SYS               BDUMP                 READ         YES NO
SYS                 USER                        SYS               BDUMP                 WRITE        YES NO

- 写入文件的匿名块。

SQL> DECLARE
    fHandle   UTL_FILE.FILE_TYPE;
 BEGIN
   fHandle := UTL_FILE.FOPEN ('BDUMP', 'test_file', 'w');

   UTL_FILE.PUT (fHandle, 'This is the first line');
      UTL_FILE.PUT (fHandle, 'This is the second line');
      UTL_FILE.PUT_LINE (fHandle, 'This is the third line');

   UTL_FILE.FCLOSE (fHandle);
    EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' || SQLERRM);
          RAISE;
    END;  
  /
DECLARE
*
ERROR at line 1:
ORA-29283: invalid file operation  <--- error your get
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 16

在上面的演示中,您看到即使您创建了目录并尝试编写您无法写入的文件。这背后的原因是服务器目录权限。见下文:

aixserver:user$ ls -lrt
dr-xr-xr-x   2 t541682  dev            2 Oct  9 10:06 fil_test

这里当我手动创建目录时,我只是给了execute权限。

现在我更改了权限:

aixserver:user$ chmod 777 fil_test
aixserver:user$ ls -lrt
drwxrwxrwx   2 t541682  dev            2 Oct  9 10:06 fil_test

我现在执行相同的PLSQL块来写入文件,我得到以下内容:

SQL> DECLARE
   fHandle   UTL_FILE.FILE_TYPE;
  BEGIN
   fHandle := UTL_FILE.FOPEN ('BDUMP', 'test_file', 'w');

   UTL_FILE.PUT (fHandle, 'This is the first line');
   UTL_FILE.PUT (fHandle, 'This is the second line');
   UTL_FILE.PUT_LINE (fHandle, 'This is the third line');

   UTL_FILE.FCLOSE (fHandle);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' || SQLERRM);
      RAISE;
END; 
/

PL/SQL procedure successfully completed.

SQL> 

我在unix服务器上检查现在创建的文件:

aixserver:user$ pwd
/app/home/user/fil_test
aixserver:user$ $ ls -lrt
total 2
-rw-r-----   1 oracle   dba           68 Oct  9 10:26 test_file

我现在看到了创建的文件。