仅在第二个代码块中遇到“ORA-29283:无效文件操作”(第一个块也成功执行,它也使用 UTL_FILE)

Posted

技术标签:

【中文标题】仅在第二个代码块中遇到“ORA-29283:无效文件操作”(第一个块也成功执行,它也使用 UTL_FILE)【英文标题】:Encountering 'ORA-29283: invalid file operation' only in the second block of code(first block executes sucessfully also which also uses UTL_FILE) 【发布时间】:2019-09-17 17:31:52 【问题描述】:

我有一个包含 2 个代码块的 SQL 文件,它们都使用 UTL_FILE 函数在同一目录中写入 2 个不同的文件。

我遇到的问题是第一个代码块执行成功,但是在执行第二个代码块时我遇到 ORA-29283: invalid file operation。

我的代码如下:

DECLARE
   fileHandler UTL_FILE.FILE_TYPE;
   vline varchar2(4000);
 BEGIN
   fileHandler := UTL_FILE.FOPEN('STAGING_REPORT', 'Report_1.csv', 'W',4000);

    UTL_FILE.FCLOSE(fileHandler);

end;
/

DECLARE
   fileHandler UTL_FILE.FILE_TYPE;
   vline varchar2(4000);
 BEGIN
   fileHandler := UTL_FILE.FOPEN('STAGING_REPORT', 'Report_2.csv', 'W',4000);

   UTL_FILE.FCLOSE(fileHandler);

end;
/ 

当我尝试在 SQLDeveloper 上执行此操作时,我首先分别执行了两个块。在那种情况下,第一个块成功执行,但第二个块抛出 ORA-29283。

在第二次尝试中,我尝试同时执行两个块,即选择它们并点击 RUN。在这种情况下,我的第一个块也成功执行,但我的第二个块没有。

经过多次此类尝试,目前,这两个块都抛出 ORA_29283 错误。

STAGING_REPORT 中已经没有报告文件(REPORT_1 和 REPORT_2)。 UTL_FILE.FOPEN 在运行时创建它们。

奇怪的是这段代码在半周前成功执行,然后突然出现异常。

我在 Oracle 12c 上运行。这里有什么我遗漏的具体内容吗?

(我已经检查了权限和其他基本内容,例如目录权限以及目录是否存在,正如我之前提到的,这段代码在半周前执行,当我手动执行时它部分执行)

我也尝试为这两个块使用两个不同的处理程序名称,但没有成功

【问题讨论】:

您在运行 RAC 吗?如果是这样,目录是否存在于所有节点上;并且文件不存在于任何节点上?我怀疑您在遇到不同情况时会间歇性地看到这一点。我希望一个会话是一致的。 (您的第二次尝试仍然是按顺序运行这些块,而不是并行运行,顺便说一句。) 目前我不确定 RAC 是什么意思,但该目录位于删除 linux 服务器上。这个目录有一个符号链接。 “(您的第二次尝试仍然是按顺序运行块,而不是并行运行,顺便说一句。)”我已经怀疑这一点,但不确定如何减轻这种情况,请您提供一些提示吗? RAC 是Real Application Clusters。本质上,您的数据库在多个服务器之间共享。如果您有权访问,请运行 select * from v$active_instances; 并查看返回了多少行 - 如果它只有一个,那么这不是问题。但是您可能有多个远程 Linux 服务器,并且目录必须存在于所有这些服务器上。 嗨,Alex 感谢您的解释。我尝试查询,发现有两个活动服务器并交叉检查了目录。该目录存在于两台服务器上。有两台服务器 41 和 42(我在查询结果中看到)但是在这些块之前使用的连接字符串是指 42,即只有 42 被连接,仍然会在 41(另一台服务器)上存在或不存在 dir 影响此代码(在 42 上运行)? 您正在连接到特定实例? (你会在它们之间重新连接吗?)这并不是我真正了解的领域,我不清楚它是否仍然可以移交给不同的实例——甚至是最小会话。如果发生任何异常情况,可能值得检查/询问 DBA,也许是一个节点过载? (另外,我想,检查下到两台服务器上目录的整个路径的 privs 是否相同,因此 Oracle 帐户是否可以读取/写入它;以及目标文件是否已经存在于任一服务器上......) 【参考方案1】:

在第二个查询中,您错过了文件扩展名。添加.csv 或其他扩展名,因此文件操作无效。

【讨论】:

其实原代码有适当的扩展名。我在提到的代码中犯了一个错误。但我现在已经更正了。 你能否通过再次运行这 2 个来共享输出,或者可能是文件尚未关闭,导致第二个块失败。尝试先运行第二个块,我想不会失败 我的输出如下:Error report: ORA-29283: invalid file operation ORA-06512: at "SYS.UTL_FILE", line 536 ORA-29283: invalid file operation ORA-06512: at line 5 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. 正如你提到的,我已经尝试过先执行第二个块,但我仍然在那个块中出错。我还尝试使用utl_file.fcloseall 函数在两者之间插入一个新的匿名块,但这也不起作用。我不明白为什么第一个块中的文件会阻碍第二个块的执行,因为它们都有不同的名称

以上是关于仅在第二个代码块中遇到“ORA-29283:无效文件操作”(第一个块也成功执行,它也使用 UTL_FILE)的主要内容,如果未能解决你的问题,请参考以下文章

仅在第一个组件通过验证时有条件地更新第二个组件

在第二个查询中查询两个单独的表传递结果,同时仅在第二个查询返回 null 时保留第一个查询的结果

Libevent 仅在第二个 buffer_write 之后写入套接字

SQL 表更改仅在第二个程序运行后可见

如何以oracle形式禁用来自不同块的项目?

APNG 在第二个页面刷新后不同步