如何在Perl中打开外部命令(sqlplus)并连续使用它而不重启

时间:2013-10-16 08:37:16

标签: oracle perl sqlplus

我是Perl脚本的初学者。并且正在编写打开外部命令(sqlplus)的perl脚本。 我想打开带有prelim设置的sqlplus,并定期获取会话信息。也就是说,在用(oradebug setmypid)和(oradebug direct_access set mode = unsafe)打开sqlplus后,我想连续发送检索查询(oradebug direct_access select * from x \ $ ksuse \ n)而不重启sqlplus。

以下代码可能会让您更好地理解我的问题

my $set = "oradebug setmypid;\n oradebug direct_access set mode=unsafe;\n oradebug direct_access select * from x\$ksuse\n";
open(PIPE, '|-', "/opt/oracle/product/11.2.0/db_1/bin/sqlplus -prelim system/oracle as sysdba");

print PIPE $set;    #if I call this call continuously, it means I open sqlplus again, again...This is not what I want^^

打开sqlplus一次后有没有办法连续运行检索查询?

提前谢谢

1 个答案:

答案 0 :(得分:3)

一般来说Expect相当有能力。在与交互式shell命令交互时要处理许多复杂问题,Expect会为您处理许多错误。

但是我必须问你确定这个(与perl的sqlplus接口)是最好的方法吗?我对Oracle专家的了解还不足以理解您的代码想要实现的目标,但是您尝试过sqlplus start syntax

query.sql中的

oradebug setmypid;
oradebug direct_access set mode=unsafe;
oradebug direct_access select * from x$ksuse;
exit;
shell中的

/opt/oracle/product/11.2.0/db_1/bin/sqlplus -prelim system/oracle as sysdba @query >data.txt

这应该将data.txt放在当前工作目录中。

另外,perl DBI也很有能力,虽然我必须说我不明白你的代码试图做什么,所以我不知道DBI是否能够帮助你。谷歌是你的朋友。

希望这有帮助!