2014-10-28 62 views
3

这里是我的表例子:如何设置变量和过程变量为MySQL在Perl脚本

Id | Time  | Predicted | Actual | High 
----+------------+------------+----------+--------- 
1 | 01:00:00 | 100  | 100 | NULL 
2 | 02:00:00 | 200  | 50 | NULL 
3 | 03:00:00 | 150  | 100 | NULL 
4 | 04:00:00 | 180  | 80 | NULL 

我想找到预测最高值,并将其放置在“高”栏(在特定的ROW)

=========使用以下语法我能够在SQL MANUALLY实现这一具有以下:

SET @峰=(SELECT MAX(预测)FROM表);

UPDATE table SET Peak = @ peak WHERE Id ='1';

Id | Time  | Predicted | Actual | High 
----+------------+------------+-----------+--------- 
1 | 01:00:00 | 100  | 100 | 200 
2 | 02:00:00 | 200  | 50  | NULL 
3 | 03:00:00 | 150  | 100 | NULL 
4 | 04:00:00 | 180  | 80  | NULL 

======================================= 

然而,当我尝试使用上面的语法在Perl脚本失败是由于“@”或任何变量符号。这是Perl的语法我试图克服变量的问题,没有真正有利。

my $Id_var= '1'; 
my $sth = $dbh->prepare('set @peak = (SELECT MAX(Predicted) FROM table)'); 
my $sti = $dbh->prepare ("UPDATE table SET Peak = @peak WHERE Id = ? "); 
$sth->execute; 
$sth->finish(); 
$sti->execute('$Id_var'); 
$sti->finish(); 
$dbh->commit or die $DBI::errstr; 

,出现以下错误: 全局符号“@peak结果这个“?在前期领先的语法与执行(@peak)”参数将在该@peak变量,即使是真实的“要求明确的包名称

我将不胜感激任何帮助,让我的Perl脚本中工作。

+0

你不应该调用'在执行'语句后完成。只需要调用'finish'的唯一时间就是如果您只想获取由SELECT返回的结果的子集。有关详细信息,请参见[文档](https://metacpan.org/pod/DBI#finish)。 – ThisSuitIsBlackNot 2014-10-28 06:35:20

+0

更重要的是,变量'$ Id_var'是单引号,所以它的值不会被内插。这意味着你的查询只会更新'Id'是字符串'$ Id_var'的行,我怀疑是你想要的。您可以忽略引号(您使用了一个占位符,因此它会在必要时自动引用该值):'$ sti-> execute($ Id_var);' – ThisSuitIsBlackNot 2014-10-28 06:38:19

+2

为什么您从select语句中的单引号切换到更新语句中的双引号?如果你坚持使用单引号,那么它就会起作用。 – 2014-10-28 09:34:43

回答

0

Perl将@peak视为一个数组。尝试将其称为\ @peak。反斜杠意思是逐字解释下一个字符。

+0

感谢男孩是我在工作脚本来克服@ – BrianB 2014-10-28 13:01:17

2

你需要躲避@ symbal(这表示数组变量),或者使用单引号,如

my $sti = $dbh->prepare ("UPDATE table SET Peak = \@peak WHE... 

或者,使用单引号

my $sti = $dbh->prepare ('UPDATE table SET Peak = @peak WHE... 
+1

完美谢谢。 – BrianB 2014-10-28 13:00:23