我有以下代码:
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
字段?如果提供的话,我希望它动态绑定。
答案 0 :(得分:6)
一个常见问题是让代码片段处理可能的值 在运行时定义或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 : ());