我想使用UTL_FILE.FOPEN('MY_DIR','test.txt','W');
但是我收到以下错误:
ORA-20102:无效操作
我试图将READ和WRITE放在&_ 39; MY_DIR'像这样对公众:
GRANT READ ON DIRECTORY MY_DIR to public;
它什么都没改变!
我对MY_DIR
(chmod 777 /test_data
)赋予了所有权利,结果相同。
答案 0 :(得分:1)
您的服务器目录路径'MY_DIR'
没有write
权限,或者可能存在其他一些未知问题(因为您说您已经授予了777权限)。
使用Create directory
命令在Oracle中创建目录时,会自动在READ
上授予WRITE
和directory
对象权限,您可以授予这些权限到其他users
和roles
。同样你可以检查如下。
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
我现在看到了创建的文件。