循环选择结果作为脚本的参数

时间:2015-02-19 16:10:23

标签: sql perl for-loop oracle11g sh

我是这个网站的新手,也是sql语言的新手,我不知道我想要的是“可能”,但这是我需要做的。

我有一个script.pl,当你像这样执行它时需要一个参数 => ./script.pl -a 102312其中“102312”是参数

使用sql请求,我从数据库中的表中获取一列,它给出了这些参数的列表 => 102312/102312/212312 / ...等

我需要为我的请求的每个结果执行命令“./script.pl -a”参数'“

我不知道它是否清楚,我不是英语,所以很抱歉

提前感谢您的帮助 小心

编辑: 嗨,再次,

我试过这个,它几乎正常工作,我在这里得到了我的.sh脚本:

#!/bin/bash
result=$(sqlplus ${USER}/${PWD}@${mydb}<< EOF
@script.sql)

echo $result

唯一的问题是,当我打印我的变量时,在查询的实际结果之前,我得到以下文本“连接到: Oracle Database 11g企业版11.2.0.4.0版 - 64位生产 使用...测试选项SQL&gt; “,然后查询结果如102312 102312 212312,然后再次”与Oracle Database 11g企业版11.2.0.4.0断开连接 - 使用分区和实际应用程序测试选项进行64位生产“ 我可以摆脱这个文本,只得到查询的结果?,以便我可以使用这些作为我的perl脚本的参数。

再次感谢您的关注

编辑2:我发现我需要在我的sqlplus请求中添加“-s”arg,现在一切正常,感谢您的帮助再次看到你

2 个答案:

答案 0 :(得分:1)

您似乎想要为从SQL查询返回的每个参数执行脚本。没有看到任何你的Perl脚本或你的SQL查询使这种难以回答,但我建议你稍微改变一下如何思考这个问题。而不是执行SQL查询,以某种方式以文本形式获取结果,然后运行您的脚本N次(其中N是SQL查询中返回的参数数量)。你可以:

  1. 修改script.pl以使用DBI执行SQL查询
  2. 循环查询结果并执行script.pl对每个参数执行的任何操作
  3. 这可能看起来像这样:

    #!/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
    }
    

答案 1 :(得分:0)

编辑: 根据您的评论,我认为您只需要在.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链接。虽然如果一切都是内部的,我只会推荐这种方法。