2014-10-28 34 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

相關問題