循环 select 结果作为脚本的参数
loop select results as arguments for script
我是这个网站的新手,也是 sql 语言的新手,我不知道我想要的是不是 "possible",但这就是我需要做的。
我有一个 script.pl 当你像这样执行它时需要一个参数
=> ./script.pl -a 102312 其中“102312”是参数
通过 sql 请求,我从数据库中的 table 中得到一列,其中列出了这些参数
=> 102312/102312/212312/...等
我需要为请求的每个结果执行命令“./script.pl -a 'argument'”
我不知道是否清楚,我不是英语所以很抱歉
在此先感谢您的帮助
保重
编辑:
再次嗨,
我试过了,它几乎可以工作了,我在这里得到了我的 .sh 脚本:
#!/bin/bash
result=$(sqlplus ${USER}/${PWD}@${mydb}<< EOF
@script.sql)
echo $result
唯一的问题是,当我打印我的变量时,在查询的实际结果之前,我得到以下文本 "Connected to:
Oracle 数据库 11g 企业版 11.2.0.4.0 版 - 64 位生产
With ... Testing options SQL> " 然后查询结果像这样 102312 102312 212312 然后又是 "Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning and Real Application Testing options"
我可以摆脱这个文本,只得到查询的结果吗?这样我就可以将它们用作我的 perl 脚本的参数。
再次感谢您的关注
编辑 2:我发现我需要在我的 sqlplus 请求中添加“-s”参数,现在一切正常,再次感谢您的帮助,再见
您似乎想要为从 SQL 查询返回的每个参数执行脚本。没有看到您的任何 Perl 脚本或您的 SQL 查询使得这种问题难以回答,但我建议您稍微改变一下您对这个问题的看法。不是执行 SQL 查询,而是以某种方式以文本形式获取结果,然后 运行 你的脚本 N 次(其中 N 是你的 SQL 查询中返回的参数数量)。你可以:
- 修改 script.pl 以使用 DBI
执行 SQL 查询
- 循环查询结果并执行 script.pl 对每个参数执行的任何操作
可能看起来像这样:
#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect(
$dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 }
);
my $sth = $dbh->prepare(
"select arguments from table where <some-condition> = ?"
);
$sth->execute( <condition> );
while ( my $row = $sth->fetchrow_arrayref ) {
# execute action on row
}
编辑:
根据您的评论,我认为您只需要在 .sh 脚本中使用 for 循环。首先,您将分配查询结果,然后使用 for 循环为结果变量中的每个参数调用 .pl 脚本。
for ARG in $RESULTS
do
perl /path/to/script.pl $ARG
done
我不太熟悉 bash 脚本,所以代码可能不太正确,但方法应该是合理的。
原回答:
如果您的查询脚本和 script.pl 必须分开但都是 Perl 脚本,您可以使用 system() 为您提供查询脚本 运行 script.pl。
假设您的参数由 / 分隔,您可以在查询脚本中执行类似的操作:
#!/usr/bin/perl
#query code to get arguments
$arguments =~ s/\// /;
system ("perl /path/to/script.pl $arguments") or die ("Something went wrong: $?\n");
然后在 script.pl 中你可以循环遍历 @_:
#!/usr/bin/perl
for my $arg (@_)
{
#script.pl code
}
这是使用 system 的 perldoc link。虽然我只在一切都是内部的情况下才推荐这种方法。
我是这个网站的新手,也是 sql 语言的新手,我不知道我想要的是不是 "possible",但这就是我需要做的。
我有一个 script.pl 当你像这样执行它时需要一个参数 => ./script.pl -a 102312 其中“102312”是参数
通过 sql 请求,我从数据库中的 table 中得到一列,其中列出了这些参数 => 102312/102312/212312/...等
我需要为请求的每个结果执行命令“./script.pl -a 'argument'”
我不知道是否清楚,我不是英语所以很抱歉
在此先感谢您的帮助 保重
编辑: 再次嗨,
我试过了,它几乎可以工作了,我在这里得到了我的 .sh 脚本:
#!/bin/bash
result=$(sqlplus ${USER}/${PWD}@${mydb}<< EOF
@script.sql)
echo $result
唯一的问题是,当我打印我的变量时,在查询的实际结果之前,我得到以下文本 "Connected to: Oracle 数据库 11g 企业版 11.2.0.4.0 版 - 64 位生产 With ... Testing options SQL> " 然后查询结果像这样 102312 102312 212312 然后又是 "Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning and Real Application Testing options" 我可以摆脱这个文本,只得到查询的结果吗?这样我就可以将它们用作我的 perl 脚本的参数。
再次感谢您的关注
编辑 2:我发现我需要在我的 sqlplus 请求中添加“-s”参数,现在一切正常,再次感谢您的帮助,再见
您似乎想要为从 SQL 查询返回的每个参数执行脚本。没有看到您的任何 Perl 脚本或您的 SQL 查询使得这种问题难以回答,但我建议您稍微改变一下您对这个问题的看法。不是执行 SQL 查询,而是以某种方式以文本形式获取结果,然后 运行 你的脚本 N 次(其中 N 是你的 SQL 查询中返回的参数数量)。你可以:
- 修改 script.pl 以使用 DBI 执行 SQL 查询
- 循环查询结果并执行 script.pl 对每个参数执行的任何操作
可能看起来像这样:
#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect(
$dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 }
);
my $sth = $dbh->prepare(
"select arguments from table where <some-condition> = ?"
);
$sth->execute( <condition> );
while ( my $row = $sth->fetchrow_arrayref ) {
# execute action on row
}
编辑: 根据您的评论,我认为您只需要在 .sh 脚本中使用 for 循环。首先,您将分配查询结果,然后使用 for 循环为结果变量中的每个参数调用 .pl 脚本。
for ARG in $RESULTS
do
perl /path/to/script.pl $ARG
done
我不太熟悉 bash 脚本,所以代码可能不太正确,但方法应该是合理的。
原回答:
如果您的查询脚本和 script.pl 必须分开但都是 Perl 脚本,您可以使用 system() 为您提供查询脚本 运行 script.pl。 假设您的参数由 / 分隔,您可以在查询脚本中执行类似的操作:
#!/usr/bin/perl
#query code to get arguments
$arguments =~ s/\// /;
system ("perl /path/to/script.pl $arguments") or die ("Something went wrong: $?\n");
然后在 script.pl 中你可以循环遍历 @_:
#!/usr/bin/perl
for my $arg (@_)
{
#script.pl code
}
这是使用 system 的 perldoc link。虽然我只在一切都是内部的情况下才推荐这种方法。