Perl DBI - 绑定一个列表

3

我该如何在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的计数,而所需的输出是TYPE1TYPE2的计数之和。将绑定条目替换为对@nature (\@nature)的引用会导致0个结果。
主要用例是允许用户使用复选框组之类的东西来检查多个选项,并返回所有结果。一种解决方法是构造一个字符串插入到查询中-它可以工作,但需要大量过滤才能避免SQL注入问题,而且很丑陋...
在我的情况下,数据库是Oracle,理想情况下,我希望有一个通用的解决方案,不受数据库影响。
1个回答

4

@nature中有多少个元素,就应该有多少个?占位符,即in (?,?,..)

my @nature = ('TYPE1','TYPE2');
my $pholders = join ",", ("?") x @nature;
my $qh = $dbh->prepare(
    "SELECT count(ref_no) FROM fm_fault WHERE nature IN ($pholders)"
) or die("Failed to prepare query: $DBI::errstr");

有趣的方法...但对于命名绑定变量不起作用...(我尽可能简化了示例,我的完整查询中有一些重复的变量,我正在使用Oracle风格的:name变量) (我想知道是否可以将?与命名类型混合使用...) 我仍然希望有一种直接绑定集合/列表的方法... - Gert van den Berg
据我所知,您必须仅使用命名占位符来处理Oracle。 - mpapec
2
这将是 my $pholders = join ", ", map ":$_", 1 .. @nature; - mpapec
快速提示:不,您不能混合占位符样式...我目前正在使用:nat$_。使用bind_param在循环中填充它,但这可能可以使用map的块形式完成...(编辑:当担心结果时,Map似乎是有意义的,因此一行for循环可能是相关选项) - Gert van den Berg
@Сухой27 - 不是的,Oracle 对 ? 占位符非常满意。 - Jim Davis
@JimDavis 我认为这只是由于 DBD::Oracle 实现 的原因。 - mpapec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接