为什么此示例代码中的第二个SELECT语句返回空结果?
use DBI;
use Data::Dumper;
my $dbh = DBI->connect('dbi:SQLite:dbname=test.db', '', '', { AutoCommit =>1, PrintError => 1, RaiseError => 1 }) or die $DBI::errstr;
my $r = $dbh->selectall_arrayref('select 123 where 5 > 2', { Slice => {} }) or die $dbh->errstr;
print Dumper $r;
$r = $dbh->selectall_arrayref('select 123 where 5 > ?', { Slice => {} }, 2) or die $dbh->errstr;
print Dumper $r;
输出
$VAR1 = [
{
'123' => 123
}
];
$VAR1 = [];
答案 0 :(得分:4)
在DBD::SQLite文档中,它说明了这一点:
这是因为DBD :: SQLite默认假定所有绑定值都是文本(并且应该引用)。
解决这个问题的方法是:
$r = $dbh->selectall_arrayref('select 123 where 5 > (?+0)', { Slice => {} }, 2)
or die $dbh->errstr;
另一个可能更好的方法是在查询之前,甚至在连接时设置sqlite_see_if_its_a_number数据库句柄属性。
$dbh->{sqlite_see_if_its_a_number}=1;
答案 1 :(得分:3)
请改为尝试:
$r = $dbh->selectall_arrayref('select 123 where 5 > 0+?', { Slice => {} }, 2);
或者,执行:
my $sth = $dbh->prepare('select 123 where 5 > ?');
$sth->bind_param(1, 2, DBI::SQL_INTEGER);
$sth->execute;
$r = $sth->fetchall_arrayref({});