use*_*664 5 sql oracle directory file
我正在尝试创建 SQL Developer 目录并使用以下代码在其中创建一个简单的文本文件:
CREATE DIRECTORY ABC AS '/abc';
DECLARE
fileHandler UTL_FILE.FILE_TYPE;
BEGIN
fileHandler := UTL_FILE.FOPEN('ABC', 'test_file.txt', 'W');
UTL_FILE.PUTF(fileHandler, 'Writing to a file\n');
UTL_FILE.FCLOSE(fileHandler);
END;
Run Code Online (Sandbox Code Playgroud)
但最终还是出现了这个错误
29283. 00000 - "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.
Run Code Online (Sandbox Code Playgroud)
在 SQL Developer 中,目录变量已创建并且可见
所以,我的问题是那段代码是否应该自行创建目录还是我必须手动创建它?(我无权访问服务器文件系统)
看起来好像GRANTS失踪了。
创建目录:
CREATE OR REPLACE DIRECTORY alias AS 'pathname';
Run Code Online (Sandbox Code Playgroud)
在哪里:
alias is the name of the directory alias.
pathname is the physical directory path.
Run Code Online (Sandbox Code Playgroud)
授予:
GRANT permission ON DIRECTORY alias TO {user | role | PUBLIC};
Run Code Online (Sandbox Code Playgroud)
在哪里:
权限是以下之一:
READ for read-only access
WRITE for write-only access
ALL for read and write access
alias is the name of the directory alias.
user is a database user name.
Run Code Online (Sandbox Code Playgroud)
编辑:
目录检查:
SQL> SELECT DIRECTORY_NAME , DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'BDUMP';
DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ---------------
BDUMP /home/fil_test/
Run Code Online (Sandbox Code Playgroud)
更改目录权限。默认情况下它对其他人只有读取和执行权限。
terminal$ chmod 777 fil_test
Run Code Online (Sandbox Code Playgroud)
堵塞:
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;
/
Execution:
SQL> @tt.sql
PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)
我看到创建的文件:
terminal$ ls -lrt test_file*
-rw-r----- 1 oracle dba 68 Oct 24 14:49 test_file
Run Code Online (Sandbox Code Playgroud)