gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:38:56 25 4
gpt4 key购买 nike

我有这个连接到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com