9

下面是我用来从表中提取数据到平面文件的代码。

BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

这段代码在我们的开发数据库中运行良好,但如果我在新数据库中执行,它会抛出以下错误。

Error starting at line 1 in command:
    BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

Error report:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
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.

Oracle directory 'SEND' points to some UNIX directory which has rights as 
       'rwxrwsr-x' (Octal 2775)
Oracle Version:11g

请帮我解决这个问题。

伙计们,如果您需要我提供更多数据来解决这个问题,请告诉我。

4

5 回答 5

7

因此,@Vivek 通过评论中的对话而不是通过实际答案找到了问题的解决方案。

“用户正在创建文件,oracle刚刚在我们的开发数据库中注意到这一点。我收到此错误是因为我尝试创建文件的目录没有写入权限,others并且用户oracle属于others类别。”

谁说 SO 是问答网站而不是论坛?呃,我,等等。无论如何,在这个问题没有公认的答案的情况下,我提供了一个链接,指向我关于UTL_FILE.FOPEN(). 在这里找到它

PS我正在标记这个答案社区维基,因为它不是这个问题的正确答案,只是重定向到其他地方。

于 2011-05-16T13:49:45.133 回答
1

假设文件已在预定义目录中创建,名称为“ table.txt

  • 1)更改文件的所有权:

    sudo chown username:username table.txt
    
  • 2)改变文件的模式

    sudo chmod 777 table.txt
    

现在,试试它应该可以工作!

于 2014-04-08T11:29:17.990 回答
0

我已经面临这个问题两天了,我发现您在Oracle中创建的目录也需要首先在您的物理磁盘上创建。

在我试图查找解决方案的任何地方,我都没有发现这一点。

例子

如果您创建了一个目录,假设是 ' DB_DIR'。

CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';

然后,您需要确保驱动器中DB_WORKS存在E:\Oracle 进程可以使用文件系统级别的读/写权限。

对于这种操作,我从我的经验中对 UTL_FILE 的理解如下。

UTL_FILE 是 SYS 用户下的对象。将 SYS.UTL_FILE 上的执行权限授予 PUBLIC;以 SYS 身份登录时需要提供。否则会在程序中报错。任何人都可以创建如下所示的目录:- CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DBWORKS'; 但是应该有 CREATE DIRECTORY 权限。这可以如下所示授予:- GRANT CREATE ALL DIRECTORY TO user; 以 SYS 用户身份登录时。但是,如果这需要由另一个用户使用,则需要向该用户授予授权,否则将引发错误。将 DB_DIR 上的读取、写入、执行权限授予用户;以创建目录的用户身份登录。然后,编译你的包。在执行该过程之前,请确保目录物理存在于您的磁盘上。否则会抛出“无效文件操作”错误。(五。重要)确保 Oracle 进程具有文件系统级别的读/写权限。这与授予的 DB 级别权限是分开的。(V. 重要)执行过程。文件应填充查询的结果集。

于 2018-08-15T06:29:32.217 回答
0

在 Windows 上,还要检查文件是否未使用 EFS 加密。在我手动解密文件之前,我遇到了同样的问题。

于 2018-09-15T17:08:24.107 回答
0

如果尝试写比文本模式更长的行ORA-29283: invalid file operation,也会引发。是函数的可选第四个参数,默认为 1024。utl_file.putmax_linesizemax_linesizeutl_file.fopen

(我的案例是将 CSV从 Docker 中的 Oracle 转储到映射为 Docker 卷的主机目录中的文件中,我被这个错误误导了很长时间 - 我在 Docker 和主机之间的文件系统权限或卷映射中寻找原因,实际上是这样愚蠢的原因。)

更新:同样的异常也发生在utl_file.fopen. 即使文件以前不存在,数据库也拒绝创建文件。尝试创建文件的目录映射到 Docker 卷上。如果预先在主机上创建了零大小的文件,它就会开始工作。但尝试从容器 ( touch /dir/file) 中创建文件失败。也许是一些 docker 问题 - 重新启动 Docker Desktop 后它消失了。

于 2021-12-07T11:15:09.503 回答