在perl中打开一个管道进程(sqlplus)并从查询中获取信息?

时间:2011-02-03 13:50:42

标签: sql perl unix sqlplus

基本上,我想使用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。等着看其他人是否回答......

3 个答案:

答案 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 $_;
}