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

eqoofvh9  于 7个月前  发布在  Unix
关注(0)|答案(4)|浏览(53)

基本上,我想使用Perl open一个到sqlplus的管道,发送一个查询,然后从查询中获取信息。
当前代码:

open(PIPE, '-|', "sqlplus user/password@server_details");

while (<PIPE>) {
    print $_;
}

字符串
这允许我跳转到sqlplus并运行我的查询。
我遇到的麻烦是如何让Perl发送sql加上查询(因为它总是相同的查询),一旦完成,我如何让信息写回我的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脚本(父)->打开管道到sqlplus(子)->在管道上打印查询-> sqlplus在屏幕上输出结果(STDOUT?)->在Perl脚本(父)中将STDOUT读入数组

编辑:这可能是因为使用这种方法将进程分叉到sqlplus中可能不可行,我 * 将 * 不得不使用DBI。只是在等着看是否有人回答.

kxe2p93d

kxe2p93d1#

忘记屏幕抓取,Perl有一个完美的cromulent database interface

bqucvtff

bqucvtff2#

我想你可能想要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页面偷来的,如果你想要更多的例子,你应该访问这个页面。

wn9m85ua

wn9m85ua3#

如果你的查询是静态的,考虑把它移到它自己的文件中,让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 $_;
}

字符串

bis0qfac

bis0qfac4#

如果你是在unix中做这件事,这很容易。我还没有想出一个在windows中做这件事的好方法。下面的$result变量将有查询的输出。我使用了一个字段分隔符,所以之后很容易解析:
$result = $oracle_home/bin/sqlplus -S "/nolog"<<EOF1 connect system/PASSWORD\@INSTNACE set heading off; set linesize 300; set feedback off; set pagesize 0; select username || '+---+' || created || '+---+' || profile || '+---+' from dba_users order by username; exit EOF1 ;
print $result .“”;

相关问题