Oracle数据库创建目录

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 中,目录变量已创建并且可见

所以,我的问题是那段代码是否应该自行创建目录还是我必须手动创建它?(我无权访问服务器文件系统)

XIN*_*ING 7

看起来好像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)