我该如何在Perl DBI中将变量绑定到SQL集合以进行IN查询?
示例:
my @nature = ('TYPE1','TYPE2'); # This is normally populated from elsewhere
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ?"
) || die("Failed to prepare query: $DBI::errstr");
# Using the array here only takes the first entry in this example, using a array ref gives no result
# bind_param and named bind variables gives similar results
$qh->execute(@nature) || die("Failed to execute query: $DBI::errstr");
print $qh->fetchrow_array();
上述代码的结果仅为
TYPE1
的计数,而所需的输出是TYPE1
和TYPE2
的计数之和。将绑定条目替换为对@nature
(\@nature
)的引用会导致0个结果。主要用例是允许用户使用复选框组之类的东西来检查多个选项,并返回所有结果。一种解决方法是构造一个字符串插入到查询中-它可以工作,但需要大量过滤才能避免SQL注入问题,而且很丑陋...
在我的情况下,数据库是Oracle,理想情况下,我希望有一个通用的解决方案,不受数据库影响。
:name
变量) (我想知道是否可以将?
与命名类型混合使用...) 我仍然希望有一种直接绑定集合/列表的方法... - Gert van den Bergmy $pholders = join ", ", map ":$_", 1 .. @nature;
。 - mpapec:nat$_
。使用bind_param在循环中填充它,但这可能可以使用map
的块形式完成...(编辑:当担心结果时,Map似乎是有意义的,因此一行for循环可能是相关选项) - Gert van den Berg?
占位符非常满意。 - Jim DavisDBD::Oracle
实现 的原因。 - mpapec