2012-06-08 51 views
2

我有这样一个查询此执行在Perl程序查询

set @valid_total:=0; 
set @invalid_total:=0; 
select week as weekno, measured_week,project_id as project, 
role_category_id as role_category, 
valid_count,valid_tickets, 
(@valid_total := @valid_total + valid_count) as valid_total, 
invalid_count,invalid_tickets, 
(@invalid_total := @invalid_total + invalid_count) as invalid_total 
from metric_fault_bug_project 
where measured_week = yearweek(curdate()) 
and role_category_id = 1 and project_id = 11; 

它执行海蒂(MySQL客户端)的罚款,但是当涉及到perl,它给了我这个错误

DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m 
anual that corresponds to your MySQL server version for the right syntax to use 
near ':=0; 
           set :=0; 
           select week as weekno, measured_week,project_id 
as project' at line 1 at D:\Mx\scripts\test.pl line 35. 
Can't execute SQL statement: You have an error in your SQL syntax; check the man 
ual that corresponds to your MySQL server version for the right syntax to use ne 
ar ':=0; 
           set :=0; 
           select week as weekno, measured_week,project_id 
as project' at line 1 

的问题似乎在set @valid_total := 0;行。

我对Perl相当陌生。谁能帮忙?

这是完整的Perl代码

#!/usr/bin/perl 

#use lib '/x01/home/kalpag/libs'; 


use DBI; 
use strict; 
use warnings; 

my $sid = 'issues'; 
my $user = 'root'; 
my $passwd = 'kalpa'; 
my $connection = "DBI:mysql:database=$sid;host=localhost"; 


my $dbhh = DBI->connect($connection, $user, $passwd) || 
      die "Database connection not made: $DBI::errstr"; 


my $sql_query = 'set @valid_total:=0; 
     set @invalid_total:=0; 
     select week as weekno, measured_week,project_id, 
       role_category_id as role_category, 
     valid_count,valid_tickets, 
      (@valid_total := @valid_total + valid_count) as valid_total, 
       invalid_count,invalid_tickets, 
     (@invalid_total := @invalid_total + invalid_count) as invalid_total 
     from metric_fault_bug_project 
     where measured_week = yearweek(curdate()) 
     and role_category_id = 1 and project_id = 11'; 

my $sth = $dbhh->prepare($sql_query) or die "Can't prepare SQL statement:  $DBI::errstr\n"; 

$sth->execute() or die "Can't execute SQL statement: $DBI::errstr\n"; 

while (my @memory = $sth->fetchrow()) 
{ 
      print "@memory \n"; 
} 
+0

我怀疑它可能与@符号有关。它似乎已经失去了变量名称。你有没有试过逃离@标志? – Soz

+0

感谢soz,是的,我已经尝试使用\ @variable_name。但它不起作用:( – KalpaG

+0

请确保你在查询周围使用单引号,使用双引号将导致Perl尝试使用变量插值来处理任何带有@或$ sigils的内容。 – Unixmonkey

回答

0

请始终使用严格和警告。如果您没有变量@valid_total,则警告会发出警告

Possible unintended interpolation of @valid_total in string 

并且严格甚至会死亡。

在双引号中的字符串必须逃脱@符号:

"set \@valid_total:=0;" 

,如果你不需要插值可言,最好使用单引号。

编辑:以后我可以看到Perl代码:

而不是做

my $sql_query = 'set @valid_total:=0; 
     set @invalid_total:=0; 
...'; 
my $sth = $dbhh->prepare($sql_query) 

你应该做的:

my $sql_query = 'set @valid_total:=0'; 
my $sth = $dbhh->prepare($sql_query); 
$sth->execute; 
$sth->finish; 

$sql_query = 'set @invalid_total:=0' 
$sth = $dbhh->prepare($sql_query); 
$sth->execute; 
$sth->finish; 
... 

你不能在一个查询中执行多个语句。

+0

我已经使用单引号。但它仍然给我这个错误 – KalpaG

+0

我不能相信你现在正在得到同样的错误。我想现在你得到了一个不同的错误,因为你试图在一个查询中使用多个语句。您必须在单个查询中执行这些语句。 – tinita

+0

你的意思是使用“do”而不是“prepare”? – KalpaG

1

您可能正在使用您的查询字符串双引号字符串,在这种情况下,perl的查找变量@valid_total@invalid_total。这意味着您没有使用

use strict; 
use warnings; 

因为否则您已经知道错误。结果是,perl用什么都替换了变量,这反映在你的错误中。

你需要做的是单引号的字符串:

my $query = 'set @valid_total:=0; 
set @invalid_total:=0; 
select week as weekno, measured_week,project_id as project, 
role_category_id as role_category, 
valid_count,valid_tickets, 
(@valid_total := @valid_total + valid_count) as valid_total, 
invalid_count,invalid_tickets, 
(@invalid_total := @invalid_total + invalid_count) as invalid_total 
from metric_fault_bug_project 
where measured_week = yearweek(curdate()) 
and role_category_id = 1 and project_id = 11'; 
+0

Thanks TLP ,但我正在使用你在这里发布的内容。但它给了我错误。它没有帮助 – KalpaG

+0

@KalpaG在这种情况下,我不能帮你,除非你发布相关的Perl代码。 – TLP

+1

看看你的错误,它表示'set:= 0',这是perl试图将一个空数组插入到字符串中的典型代码。我无法重现您的错误。 – TLP