我最近对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是否传递给占位符。
答案 0 :(得分:0)
您永远不会执行您准备的声明。使用
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,
);
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'
)
});