Perl DBI выполнить не распознает '?'
У меня есть этот код:
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 выполнить не удалось: вызывается с 5 переменными связывания, когда требуется 0.
Зачем?
2 ответа
Решение
Если вы включили строгие и / или предупреждения, вы увидите, в чем ваша проблема.
Ты пишешь
if (...) {
my $sql = ...;
} else {
my $sql = ...;
}
execute($sql);
Это означает, что $sql
переменные, которые вы объявляете в if
ветви не находятся в области видимости, и вы пытаетесь выполнить полностью пустой SQL.
Вы готовите буквальный '$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');