【问题标题】:Perl DBI - binding a listPerl DBI - 绑定列表
【发布时间】:2023-03-04 22:46:01
【问题描述】:

如何在 Perl DBI 中为 IN 查询将变量绑定到 SQL 集?

例子:

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,理想情况下我想要一个不受数据库影响的通用解决方案。

【问题讨论】:

    标签: sql perl dbi bind-variables


    【解决方案1】:

    ? 占位符的数量应该与@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 变量)(我想知道你是否可以将? 与命名类型混合......)我仍然希望有一种方法可以直接绑定一个集合/列表......
    • AFAIK,您只能使用 Oracle 的命名占位符。
    • 那就是my $pholders = join ", ", map ":$_", 1 .. @nature;
    • 快速说明:不,您不能混合占位符样式...我目前正在使用:nat$_.. 使用 bind_param 将其填充到循环中,但这可能可以通过 @987654329 完成@的块形式...(编辑:地图似乎主要在担心结果时才有意义,所以一行 for 可能是相关选项)
    • @Сухой27 - 不,Oracle 对 ? 占位符非常满意。
    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2011-06-13
    • 2023-04-10
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多