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

时间:2015-09-03 19:05:19

标签: oracle ora-03113

我得到一个奇怪的错误,我无法弄清楚....

执行脚本时出现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 个答案:

答案 0 :(得分:0)

确定。 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进程的stdin 0和stdout 1。请注意,他们使用/ dev / null - " bitbucket"或黑洞。

所以你要求远程进程进程执行,这意味着它作为终端设备传递/ dev / null。这个过程对你的stdout tty没有任何线索。

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