ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾

Posted

技术标签:

【中文标题】ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾【英文标题】:ORA-03113: end-of-file on communication channel after os_command.exec is redirected to standard output 【发布时间】:2015-09-03 19:05:18 【问题描述】:

我遇到了一个我无法弄清楚的奇怪错误......

执行脚本时出现 ORA-03113 错误。我制作了一个虚拟脚本,它给出了正在发生的事情的本质:

declare
command_line varchar2(100);
v_stdout clob;
v_return number;
begin
    dbms_lob.createtemporary(v_stdout, true, DBMS_LOB.CALL);
command_line := './test.shl';
v_return := os_command.exec(p_command => command_line, p_stdout => v_stdout);
end;
/

test.shl:

echo 'Yay' > thisworked.log

当我执行此操作时,不会创建日志文件,会发生以下情况:

SQL> @morebroke
declare
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 77264
Session ID: 50 Serial number: 8551

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

好的。 stdout 是唯一附加到您的进程的 tty,除非您重定向它。

当您通过 sqlplus 连接时,oracle 会创建一个与您的进程对话的单独进程。 oracle 独立进程无法知道您的特殊 tty。为什么?因为运行 sqlplus 的进程可以在网络上的任何地方。

这与 dbms_output 在存储过程中不执行任何操作的原因相同。 来自 Solaris 上的 /proc:

lrwxrwxrwx   1 oracle   oinstall       0 Sep  3 07:38 0 -> /dev/null
lrwxrwxrwx   1 oracle   oinstall       0 Sep  3 07:38 1 -> /dev/null

它们是 oracle 服务器上 sqlplus 进程的标准输入 0 和标准输出 1。请注意,他们使用 /dev/null - “bitbucket”或黑洞。

因此,您要求执行该远程进程进程,这意味着它将 /dev/null 作为终端设备传递。该过程不知道您的标准输出 tty。

请改用utl_file 包。或者编写编译后的代码 -> 像 Pro*C 一样,直接执行 SQL,将结果集返回到局部变量,然后将其写入文件。

【讨论】:

以上是关于ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾的主要内容,如果未能解决你的问题,请参考以下文章

选择语句在 Oracle 11 上给出 ora-03113

Oracle 启动服务时报ora-03113错

Oracle 11.2.0.1的一个Bug,客户端报ORA-03113: 通信通道的文件结尾

ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾

ORA-03113: End-of-file on Communication Channel Upon Startup of Database

ORA-03113错误