如何在Perl中运行时绑定DBI参数?

时间:2011-12-11 15:23:46

标签: perl dbi

我有以下代码:

sub run_query { 
    my $name = shift || undef;
    my $sql  = (defined $name ) ? "select * from table where name = ?" :
                                  "select * from table";
    my $sth  = $dbh->prepare("$sql");
    $sth->execute($name);
}

上述子例程需要按如下方式工作:如果提供了$name,则运行第一个查询,否则从表中获取所有数据。如何绑定name字段?如果提供的话,我希望它动态绑定。

3 个答案:

答案 0 :(得分:6)

来自DBI documentation on cpan

  

一个常见问题是让代码片段处理可能的值   在运行时定义或undef(非NULL或NULL)。一个简单的   技术是根据需要准备适当的声明,和   将占位符替换为非NULL情况:

  $sql_clause = defined $age ? "age = ?" : "age IS NULL";
  $sth = $dbh->prepare(qq{
    SELECT fullname FROM people WHERE $sql_clause
  });
  $sth->execute(defined $age ? $age : ());

它并不完全适用于你的问题,我假设是你的执行失败,如果你添加一个不期望的参数。所以,这里的最后一行适用:

  $sth->execute(defined $name ? $name : ());

答案 1 :(得分:4)

你应该有两个不同的潜艇,但你可以使用

sub run_query { 
    my $sql = @_
       ? "select * from table where name = ?"
       : "select * from table";
    my $sth  = $dbh->prepare($sql);
    $sth->execute(@_);
}

答案 2 :(得分:1)

如果未定义$name,您可以有条件地省略参数:

$sth->execute(defined $name ? $name : ());