在perl中打开管道进程(sqlplus)并从查询中获取信息?
基本上,我希望使用Perl在perl中打开管道进程(sqlplus)并从查询中获取信息?,sql,perl,unix,sqlplus,Sql,Perl,Unix,Sqlplus,基本上,我希望使用Perl打开到sqlplus的管道,发送一个查询,然后从查询中获取信息 当前代码: open(PIPE, '-|', "sqlplus user/password@server_details"); while (<PIPE>) { print $_; } 是否会从sqlplus中获取STDOUT,然后使用Perl(父)脚本存储它 基本上,我想将其存储在一个数组中,以便以后进行解析 流程图: Perl脚本(父级)->打开管道到sqlplus(子级)->管
打开到sqlplus的管道,发送一个查询,然后从查询中获取信息
当前代码:
open(PIPE, '-|', "sqlplus user/password@server_details");
while (<PIPE>) {
print $_;
}
是否会从sqlplus中获取STDOUT
,然后使用Perl(父)脚本存储它
基本上,我想将其存储在一个数组中,以便以后进行解析
流程图:
Perl脚本(父级)->打开管道到sqlplus(子级)->管道上打印查询->sqlplus在屏幕上输出结果(STDOUT?->将STDOUT读取到Perl脚本(父级)中的数组中
编辑:可能使用此方法无法将流程分叉到sqlplus中,我将不得不使用DBI。只是等着看是否有人回答…忘记屏幕抓取,Perl有一个完美的工具。我想你可能想要。您将使用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页面中盗取的,如果你想要更多的例子,你应该访问它。 如果你的查询是静态的,考虑把它移到它自己的文件中,并拥有<代码> 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 $_;
}
open(我的$pipe,'-|','sqlplus','user/password@server_details“,”@/path/to/sql lib/your query.sql”、“query_param_1”、“query_param_2”)或die$!;
而(){
打印美元;
}
刚刚修改了我的问题。无论如何,谢谢你指出这一点!我可以不安装这个模块/库就完成它吗?@Az,是的,你可以(参见核心模块IPC::Open2),但是上帝保佑第一次尝试它的人,在大约第四次重写之后,因为您发现了一些您从未想过会发生的奇怪的模糊行为,所以您希望您只使用经过良好测试的模块。只需检查:-|
之后的所有“参数”都是提供给bash进程的参数,对吗?对于open
来说,这只是一个巨大的参数,yarp?@Az,不完全是这样,永远不会调用open
列表而不是单个命令名bash
。这限制了相当多的代码注入向量,但也阻止您在命令本身中使用bash
的功能。你能提供比“不起作用”更详细的信息吗?是否有错误输出sqlplus
希望您在执行文件后以交互方式使用它,因此您可能需要使用exit
结束sql文件,以便而循环终止。您还可以从命令行测试命令,将其与Perl脚本分开,以查看它是Perl端还是sqlplus端的问题。密码中有一些字符需要使用``进行破译,因此单引号不能很好地使用。对此表示抱歉(我已注销,发生了随机事件)。无论如何,我很感激你的建议,但我真的很想从我的困境中继续(更新问题):)(PS—这就是我提到的我对Perl非常陌生的地方)。
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 $_;
}