-1

我是 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一次后连续运行检索查询?

先感谢您

4

1 回答 1

3

一般来说,Expect是相当有能力的。与交互式 shell 命令交互时有很多复杂的事情需要处理,Expect 会为您处理其中的许多问题。

但是我必须问你确定这(与 perl 中的 sqlplus 接口)是最好的方法吗?我还不足以成为 Oracle 专家来理解您的代码想要实现的目标,但是您是否尝试过sqlplusstart 语法

query.sql

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

在外壳中:

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

这应该data.txt与您的结果一起放在当前工作目录中。

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

希望这可以帮助!

于 2013-10-16T08:58:13.747 回答