如何在select查询的条件下选择数组的值?

时间:2017-10-14 16:19:19

标签: sql oracle perl scripting

我无法找到如何选择< *>之前的值e是数组var1的第5个值。

my $sql2 = 'select name, value from A.Database2 minus select name, value from A.database1';

my $sth2 = $dbh1->prepare($sql2);
$sth2->execute();

while ( my @row = $sth2->fetchrow_array ) {

    print join(',', @row), "\n\n";

    chomp;    

    push( @var1, $row[0] );
}

foreach ( @var1 ) {
    print "$_\n";
}

my $sth3 = $dbh->prepare("select name, value from A.database1 where name in (" . join(",", @var1) . ")" ) or die "Can't prepare statement: $DBI::errstr";
$sth3->execute(@var1);

while ( my @row = $sth3->fetchrow_array ) {
    print join(", ", @row), "\n";
}
  

DBD :: Oracle :: db准备失败:ORA-00904:" APR_IMDG_MODE_ENABLED":无效标识符(DBD错误:错误可能接近< *>指示符在char 144处'选择名称,来自A的值,其中名称在(a,b,c,d,< *> e)')[for Statement"选择名称,A中的值,其中名称在(a,b, c,d,e)"]在hello.pl第102行。

     

用户代码未捕获的异常:
          无法准备声明:ORA-00904:" APR_IMDG_MODE_ENABLED":无效标识符(DBD错误:错误可能在char 144附近的< *>指示符中'选择名称,值来自哪里在hello.pl第102行的(a,b,c,d,< *> e)')中命名。

2 个答案:

答案 0 :(得分:1)

如果您想从<*>中的字符串开头删除@var1,那么您可以写

S/^<\*>// for @var1

您还需要引用IN子句的每个元素,否则这些值将被视为列名。您可以使用$dbh1->quote,但最好使用占位符,方法是在?, ?, ?, ...

中使用尽可能多的占位符构建一串问号@var1

这应该适合你,但我目前无法测试它。请注意,为SQL语句使用大写语言单词和 heredoc 以提高可读性会更好

s/^<\*>// for @var1;  # remove any indicators

my $pholds = join ', ', ('?') x @var1;  # "?, ?, ?, ?, ?"

my $sth3 = $dbh->prepare(<<END_SQL) or die "Can't prepare statement: $DBI::errstr";
SELECT name, value FROM A.database1
WHERE name IN ($pholds)
END_SQL

$sth3->execute(@var1);

while ( my @row = $sth3->fetchrow_array ) {
    print join(", ", @row), "\n";
}

答案 1 :(得分:0)

chomp删除尾随空格。见perldoc -f chomp。它不能是你想要的。 剥离前导&lt;&gt;你可以使用s/^<>//