Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中打开管道进程(sqlplus)并从查询中获取信息?_Sql_Perl_Unix_Sqlplus - Fatal编程技术网

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

在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(子级)->管

基本上,我希望使用Perl
打开到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 $_;
}