perl DBI执行不识别'?'

时间:2013-10-18 17:31:39

标签: database perl postgresql dbd dbd-pg

我有这段代码:

if($update[$entity_id])
{
    my $sql = "UPDATE cache SET date = '?', value = '?' WHERE item_id = ? AND level = ? AND type = ?;";
}
else
{
    my $sql = "INSERT INTO cache (date, value, item_id, level, type) VALUES ('?','?',?,?,?);";
}
my $db = $self->{dbh}->prepare(q{$sql}) or die ("unable to prepare");
$db->execute(time2str("%Y-%m-%d %X", time), $stored, $entity_id, 'entity', 'variance');

但是当它想要运行更新时,我得到了这个错误:

  

DBD :: Pg :: st执行失败:当需要0时,使用5个绑定变量调用。

为什么?

2 个答案:

答案 0 :(得分:6)

您正在准备文字'$sql',但这不是您唯一的问题,词汇$sql变量超出了{}之外的范围。

尝试,

use strict;
use warnings;
#...

my $sql;
if($update[$entity_id])
{
    $sql = "UPDATE cache SET date = ?, value = ? WHERE item_id = ? AND level = ? AND type = ?";
}
else
{
    $sql = "INSERT INTO cache (date, value, item_id, level, type) VALUES (?,?,?,?,?)";
}
my $st = $self->{dbh}->prepare($sql) or die ("unable to prepare");
$st->execute(time2str("%Y-%m-%d %X", time), $stored, $entity_id, 'entity', 'variance');

答案 1 :(得分:6)

如果你打开了严格和/或警告,你会看到你的问题是什么。

你正在写

if (...) {
    my $sql = ...;
} else {
    my $sql = ...;
}
execute($sql);

这意味着您在$sql分支中声明的if变量不在范围中,并且您尝试执行完全空的SQL。