基本上,我想使用Perl open
管道到sqlplus,发送查询然后从查询中获取信息。
当前代码:
open(PIPE, '-|', "sqlplus user/password@server_details");
while (<PIPE>) {
print $_;
}
这允许我跳转到sqlplus并运行我的查询。
我无法弄清楚如何让Perl向sqlplus发送查询(因为它始终是相同的查询),一旦完成,我怎样才能将信息写回我的Perl脚本中的变量?
PS - 我知道DBI
...但我想知道如何使用上面的方法做到这一点,因为它不优雅:)
对代码进行了一些更改,现在我可以将查询发送到sqlplus,但它断开连接 ...我不知道如何从中获取结果。
my $squery = "select column from table where rownum <= 10;"
# Open pipe to sqlplus, connect to server...
open(PIPE, '|-', "sqlplus user/password@server_details") or die "I cannot fork: $!";
# Print the query to PIPE?
print PIPE $squery;
从sqlplus抓取STDOUT
然后使用Perl(父)脚本存储它会不会这样?
我想将它存储在一个数组中,以便以后解析,基本上。
流程图:
Perl脚本(父级) - &gt;打开管道进入sqlplus(子) - &gt;在管道上打印查询 - &gt; sqlplus在屏幕上输出结果(STDOUT?) - &gt;将STDOUT读入Perl脚本(父)中的数组
编辑:可能是使用此方法将进程分配到sqlplus可能不可行,而将必须使用DBI。等着看其他人是否回答......
答案 0 :(得分:5)
忘记屏幕抓取,Perl有一个完美的database interface。
答案 1 :(得分:3)
我想你可能想要IPC::Run。您将使用start
函数来完成任务:
my $h = start \@cat, \$in, \$out;
您可以将查询分配到$input
变量并进行抽取,直到获得$output
变量中的预期输出。
$in = "first input\n";
## Now do I/O. start() does no I/O.
pump $h while length $in; ## Wait for all input to go
## Now do some more I/O.
$in = "second input\n";
pump $h until $out =~ /second input/;
## Clean up
finish $h or die "cat returned $?";
此示例在CPAN页面中被盗,如果您想要更多示例,请访问该页面。
答案 2 :(得分:0)
如果您的查询是静态的,请考虑将其移入自己的文件并加载sqlplus
并执行它。
open(my $pipe, '-|', 'sqlplus', 'user/password@server_details', '@/path/to/sql-lib/your-query.sql', 'query_param_1', 'query_param_2') or die $!;
while (<$pipe>) {
print $_;
}