Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带引号内占位符的查询?(perl/postgresql)_Perl_Postgresql_Dbi - Fatal编程技术网

如何使用带引号内占位符的查询?(perl/postgresql)

如何使用带引号内占位符的查询?(perl/postgresql),perl,postgresql,dbi,Perl,Postgresql,Dbi,我正在尝试执行以下脚本: #!/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->p

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

#!/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";
(到达日期的格式为:时区非空的时间戳默认当前时间戳)

问题在于未检测到问号占位符,因为其内部有单引号:

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

如果我使用qq{},$1占位符,并尝试使用$dbh->quote的一些变体,则没有帮助。我怎样才能做到这一点呢?

我的$query=$dbh->prepare(prepare(我刚刚在这里找到了一个解决方案:

my $query = $dbh->prepare (<<SQL) or die ("unable to prepare");
SELECT arrival_date - INTERVAL ? FROM emails LIMIT 1
SQL
$query->execute("60 MINUTE");
它使用?::interval而不是“interval”工作:

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);

这样,在执行查询时,您不必在数字后面附加
“分钟”

DBD::Pg::st execute failed:ERROR:syntax ERROR在“$1”处或附近,以及在“$1”处或附近”(“在第二个版本中
my $query = $dbh->prepare (q{SELECT
                   arrival_date - ? * INTERVAL '1 MINUTE'
                   FROM emails LIMIT 1});
$query->execute(60);