【问题标题】:How can I use a query with placeholder inside quotes? (perl / postgresql)如何在引号内使用带有占位符的查询? (perl/postgresql)
【发布时间】:2012-05-19 05:33:07
【问题描述】:

我正在尝试执行以下脚本:

#!/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 格式如下:timestamp with time zone NOT NULL default CURRENT_TIMESTAMP)

问题是问号占位符没有被检测到,因为它在单引号内:

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

如果我使用 qq{}、$1 占位符并尝试使用 $dbh->quote 的一些变体,这将无济于事。我怎样才能做到这一点?

【问题讨论】:

    标签: perl postgresql dbi


    【解决方案1】:

    您不能在引号内使用占位符。您可以使用 SQL 字符串连接,但在这种情况下,使用乘法会更容易:

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

    这样,您不必在执行查询时将' minutes' 附加到数字。

    【讨论】:

      【解决方案2】:

      我刚刚在这里找到了解决方案: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');
      

      【讨论】:

        【解决方案3】:
        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);
        

        【讨论】:

        • DBD::Pg::st 执行失败:错误:在 "$1" 或附近的语法错误,以及在第二个版本中的 "(" 或附近
        猜你喜欢
        • 2012-12-22
        • 2010-09-22
        • 2019-02-15
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        相关资源
        最近更新 更多