首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-03113:将os_command.exec重定向到标准输出后,通信通道上的文件结束

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

Stack Overflow用户
提问于 2015-09-04 03:05:19
回答 1查看 1.1K关注 0票数 0

我收到一个奇怪的错误,我就是搞不清楚...

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
echo 'Yay' > thisworked.log

当我执行此命令时,没有创建日志文件,下面是发生的情况:

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

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2015-09-04 05:08:13

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

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

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

代码语言:javascript
复制
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“或黑洞。

因此,您请求远程进程执行exec,这意味着它将/dev/null作为终端设备进行传递。该进程对您的stdout tty一无所知。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32383549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档