5

次のスクリプトを実行しようとしています。

#!/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";

(arrival_dateの形式は次のとおりです:タイムゾーンのタイムスタンプNOT NULLデフォルトCURRENT_TIMESTAMP)

問題は、疑問符のプレースホルダーが一重引用符で囲まれているために検出されないことです。

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

qq {}、$ 1プレースホルダーを使用し、$dbh->quoteでいくつかのバリエーションを試した場合は役に立ちません。どうすればこれを機能させることができますか?

4

3 に答える 3

10

引用符内でプレースホルダーを使用することはできません。SQL文字列の連結を使用できますが、この場合、乗算を使用する方が簡単です。

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

' minutes'そうすれば、クエリを実行するときに番号を追加する必要がありません。

于 2012-05-18T21:33:07.523 に答える
3

私はここで解決策を見つけました:http: //bugs.debian.org/cgi-bin/bugreport.cgi? bug = 321917

'interval?'の代わりに?::intervalを使用して機能します。

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

$query->execute('60 MINUTE');
于 2012-05-18T21:29:30.600 に答える
2
my $query = $dbh->prepare (<<SQL) or die ("unable to prepare");
SELECT arrival_date - INTERVAL ? FROM emails LIMIT 1
SQL
$query->execute("60 MINUTE");

また

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

于 2012-05-18T21:14:52.797 に答える