我有这个Perl脚本连接到sqlplus数据库并运行以下命令。
my $SQLPLUS='/opt/oracle/product/11g/db_1/bin/sqlplus -S system/coolman7@vsdb';
`$SQLPLUS \@${basePath}/VoucherQuery1.sql $startdate> ${basePath}/QueryResult1.txt`;
现在我试图通过IPC :: Run运行第二个命令。我在很多方面都尝试过没有任何成功。像
open (WFH1, ">", "${basePath}/QueryResult4.txt");
run('$SQLPLUS \@${basePath}/VoucherQuery4.sql $startdate', '>', \\WFH1);
close(WH1);
但它无法连接到sqlplus或写入输出文件。我在谷歌和其他论坛搜索过但没有得到任何解决方案。请帮忙。 :)
答案 0 :(得分:3)
使用词法文件句柄可以让生活变得更加轻松。它们不是全局的,当它们超出范围时它们会自动关闭。
open (my $wfh1, ">", "${basePath}/QueryResult4.txt");
整个问题可能是open
失败了,你没有检查它是否成功。你可以用两种方法做到这一点。首先是手工完成......
my $query_result_file = "${basePath}/QueryResult4.txt";
open (my $wfh1, ">", $query_result_file)
or die "Couldn't open $query_result_file for writing: $!";
或者您可以使用autodie为您执行此操作。
use autodie;
open (my $wfh1, ">", "${basePath}/QueryResult4.txt");
但您根本不需要手动打开文件,如果您传递文件名,IPC :: Run会为您执行此操作。
下一个问题是您传递给run
的问题。它是单引号,这意味着不会插入任何变量。你真的试图运行$SQLPLUS @${basePath}/VoucherQuery4.sql $startdate
。你需要双引号。
但最好将命令和参数作为数组引用传递,这样IPC :: Run将为你处理shell引用。
这是一个使用cat
读取文件,添加行号并将结果输出到文件的简单示例。
use IPC::Run qw(run);
run ["cat", "-n"], "<", "/etc/passwd", ">", "test.out";
全部放在一起......
my $SQLPLUS_EXE = '/opt/oracle/product/11g/db_1/bin/sqlplus';
my $SQLPLUS_DB = 'system/coolman7@vsdb';
my @SQLPLUS_CMD = ($SQLPLUS_EXE, '-S', $SQLPLUS_DB);
run [@SQLPLUS_CMD, "\@${basePath}/VoucherQuery4.sql", $startdate],
">", "${basePath}/QueryResult4.txt";