我无法找到如何选择< *>之前的值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)')中命名。
答案 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/^<>//