Как я могу использовать запрос с заполнителем внутри кавычек? (perl / postgresql)

Я пытаюсь выполнить следующий скрипт:

#!/usr/bin/perl -w

use strict;
use DBI;

my $db = "Pg";
my $db_database = "whatever";
my $user = "whatever";
my $password = "whatever";

my $dbh = DBI->connect("dbi:$db:dbname=$db_database", $user, $password);

my $query = $dbh->prepare (q{SELECT
                   arrival_date - INTERVAL '? MINUTE'
                   FROM emails LIMIT 1})
  or die ("unable to prepare");
$query->execute(60) or die("unable to execute");

print $query->fetchrow_array, "\n";

(дата прибытия имеет следующий формат: отметка времени с часовым поясом НЕ ПУСТО по умолчанию CURRENT_TIMESTAMP)

Проблема в том, что заполнитель вопросительного знака не обнаружен, потому что его внутри одинарные кавычки:

DBD::Pg::st execute failed: called with 1 bind variables when 0 are needed 

Это не поможет, если я использую qq {}, заполнитель $ 1, и попробовал несколько вариантов с $ dbh-> quote. Как я могу заставить это работать?

Ответы на вопрос(3)

prepare (<<SQL) or die ("unable to prepare");
SELECT arrival_date - INTERVAL ? FROM emails LIMIT 1
SQL
$query->execute("60 MINUTE");

ил

;prepare (<<SQL) or die ("unable to prepare");
SELECT arrival_date - INTERVAL CONCAT(?, " MINUTE") FROM emails LIMIT 1
SQL
$query->execute(60);

 atlau18 мая 2012 г., 23:25
DBD :: Pg :: st выполнить не удалось: ОШИБКА: синтаксическая ошибка в или около "$ 1", или в "или около" ("во второй версии

http: //bugs.debian.org/cgi-bin/bugreport.cgi ошибка = 321917

Он работает, используя? :: интервал вместо 'интервал?':

my $query = $dbh->prepare (q{SELECT
                   arrival_date - ?::interval
                   FROM emails LIMIT 1});

$query->execute('60 MINUTE');
Решение Вопроса

зовать конкатенацию строк SQL, но в этом случае проще сделать это с помощью умножения:

my $query = $dbh->prepare (q{SELECT
                   arrival_date - ? * INTERVAL '1 MINUTE'
                   FROM emails LIMIT 1});
$query->execute(60);

Таким образом, вам не нужно добавлять' minutes' на номер при выполнении запроса.

 atlau18 мая 2012 г., 23:52
да, это тоже работает, спасибо

Ваш ответ на вопрос