UTL_FILE:无法创建新文件

Posted

技术标签:

【中文标题】UTL_FILE:无法创建新文件【英文标题】:UTL_FILE: Could not create a new file 【发布时间】:2017-10-24 12:36:28 【问题描述】:

我在 ly 代码中使用此语句来创建/打开一个文件:如果尚不存在则创建它/如果已存在则打开它。

   w_file_handle := utl_file.fopen ('SAUV_DIR',
                                'sauv_tab_tbrcs_params.txt' ,
                                'W') ;

该文件尚不存在,但无法创建。

我收到了这个错误:

SQL> @MyScript.sql
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 14

如果文件不存在,有什么想法可以创建文件吗?

【问题讨论】:

【参考方案1】:

您可以参考此代码在您的目录中创建一个文件。

我用下面的代码创建了一个 tt.sql 文件。我检查了我有一个工作目录“BDUMP”。

目录检查:

SQL> SELECT DIRECTORY_NAME , DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'BDUMP';

DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ---------------
BDUMP                          /home/fil_test/

更改目录权限。默认情况下,它只对其他人具有读取和执行权限。

terminal$ chmod 777 fil_test

块:

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;
/

执行:

SQL> @tt.sql

PL/SQL procedure successfully completed.

我看到创建的文件:

terminal$ ls -lrt test_file*
-rw-r-----   1 oracle   dba           68 Oct 24 14:49 test_file

【讨论】:

我由begin Read_Writ_file(); end;执行 我有同样的错误:29283. 00000 - “无效的文件操作” *原因:试图从不存在的文件或目录中读取,或文件或目录访问被操作系统拒绝。 *Action:验证文件系统上的文件和目录访问权限,如果读取,验证文件是否存在。 ...但是当我在目录中手动创建文件时它成功执行。我希望它是由语句创建的。 @O.Sam 这意味着该目录在您的情况下不存在。检查目录是否存在。阅读更新后的帖子。还授予您目录的权限777 感谢@XING,目录存在。我没有给予许可。脚本执行成功(:y)

以上是关于UTL_FILE:无法创建新文件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle错误——ORA-39002:操作无效ORA-39070:无法打开日志文件ORA-06512:在“SYS.UTL_FILE”,line

计算由 UTL_FILE 创建的文件中的行数

UTL_FILE

utl_file.FCLOSE() 处理大文件时速度很慢

在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据

使用 UTL_FILE 脚本损坏文件