oracle - 如何在 perl 脚本中使用 IPC::Run 模块

标签 oracle perl solaris sqlplus

我有这个连接到 sqlplus 数据库并运行以下命令的 Perl 脚本。

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 或写入输出文件。我在谷歌和其他论坛中搜索过,但没有任何解决方案。请帮忙。 :)

最佳答案

使用词法文件句柄通常会使生活变得更轻松。它们不是全局的,当它们超出范围时它们会自动关闭。

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 .你需要双引号。

但最好将您的命令和参数作为数组 ref 传递,这样 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";

关于oracle - 如何在 perl 脚本中使用 IPC::Run 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27653385/

相关文章:

c# - 将 IN 子句中的多个数字作为参数传递给 Oracle 查询时出现无效数字异常

unix - 在多个 korn (ksh93) shell 脚本中使用的环境变量 (getter-setter)

linux - 适用于 Linux 和 Solaris 的通用 grep 方法

regex - 为什么我的Perl单线报告 “Bareword found where operator expected”?

linux - 如果使用 AND 条件,awk -F 找不到字符串

sql - 带时区的 Oracle DateTime 查询

python - 使用 Python 的正确编码从 Oracle 导入

oracle - Oracle 和 Hibernate 中的 generatedValue 不起作用

loops - 重叠脚本: how to solve?

perl - 如何在 Perl 中 sprintf 一个大数字?