循环 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 查询中返回的参数数量)。你可以:

  1. 修改 script.pl 以使用 DBI
  2. 执行 SQL 查询
  3. 循环查询结果并执行 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。虽然我只在一切都是内部的情况下才推荐这种方法。