仅在第二个代码块中遇到“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 时保留第一个查询的结果