如何使用带引号内占位符的查询?(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);