基本上,我想使用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。只是在等着看是否有人回答.
4条答案
按热度按时间kxe2p93d1#
忘记屏幕抓取,Perl有一个完美的cromulent database interface。
bqucvtff2#
我想你可能想要IPC::Run。你将使用
start
函数来运行:字符串
您可以将查询分配给
$input
变量,并进行泵操作,直到在$output
变量中获得预期的输出。型
这个例子是从CPAN页面偷来的,如果你想要更多的例子,你应该访问这个页面。
wn9m85ua3#
如果你的查询是静态的,考虑把它移到它自己的文件中,让
sqlplus
加载并执行它。字符串
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 .“”;