如何为DBD Mysql Perl占位符变量

时间:2015-03-24 14:50:18

标签: perl

我最近对dbi有一些帮助,并在Perl中使用占位符进行Mysql查询。但是,当我在dbi脚本中为先前声明或准备好的变量使用多个语句时,我遇到了一个问题。

代码:

use strict;
use warnings;
use DBI qw(:sql_types);

my $dbh = DBI->connect("DBI:mysql:...", ...);

## TABLE CREATION
$dbh->do("USE test;")
$dbh->do("CREATE TEMPORARY TABLE day5 (id INT, temp VARCHAR(4), time TIME, sumadd INT(11))");
$dbh->do("CREATE TEMPORARY TABLE humid (temp VARCHAR(4), i24 INT (10))");   
$dbh->do("INSERT INTO day5 (id,temp,time) VALUES(1,'30','03:00:00') ");
$dbh->do("INSERT INTO humid (temp,i24) VALUES('30',8321) ");

## FAILING CODE
my $inter1 = 'i24';  # Generated value
my $sth = $dbh->prepare("SET \@sumadd5 = (SELECT ? FROM humid WHERE temp ='30') ");
$sth->bind_param( 1, $inter1 ); 
$sth->finish();
$dbh->do("UPDATE day5 SET sumadd= (SELECT \@sumadd5) WHERE time= '03:00:00' ");

my $sumadd = $dbh->selectrow_array("SELECT sumadd FROM day5");
print "$sumadd\n";

$dbh->disconnect();

$sumadd未定义,但我希望8321

我的问题是如何才能将@ sumadd5变量插入到上面的查询中[UPDATE day5 SET sumadd =]?我本着清晰的精神在语法中添加了一些评论。

如果我通过将语法应用到MYSQL去除PERL SPECIFICS我的表更新来手动运行。如果我把这些脚本没有发生在桌子上,并且没有显示任何错误。

我怀疑中断是UPDATE,但我无法确认$ inter1是否传递给占位符。

1 个答案:

答案 0 :(得分:0)

问题#1

您永远不会执行您准备的声明。使用

my $sth = $dbh->prepare(q{...});
$sth->bind_param(1, $inter1); 
$sth->execute();               <---
$sth->finish();

快捷方式#1:

my $sth = $dbh->prepare(q{...});
$sth->execute($inter1);
$sth->finish();

快捷方式#2:

$dbh->do(
   q{...},
   undef,
   $inter1,
);

问题#2

SELECT ? ...

表现得就像你已经完成了

SELECT "i24" ...     // As opposed to: SELECT i24 ...

就像

一样
SELECT time ...

表现得就像你已经完成了

SELECT '03:00:00' ...`

您无法构建正在执行的SQL语句。您需要在执行它之前构建它。使用

$dbh->do(q{
   SET @sumadd5 = (
      SELECT }.( $dbh->quote_identifier($inter1) ).q{
        FROM humid
       WHERE temp = '30'
   )
});