2012-06-08 3 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

Вы имеете в виду использование «делать» вместо «подготовить» ??? – 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

Спасибо TLP , но я использую именно то, что вы разместили здесь. но это дает мне ошибку. это не помогло – KalpaG

+0

@KalpaG В этом случае я не могу вам помочь, если вы не разместите соответствующий код perl. – TLP

+1

Рассматривая вашу ошибку, она говорит 'set: = 0', что типично для perl, пытающегося интерполировать пустой массив в строку. Я не могу воспроизвести вашу ошибку. – TLP

Смежные вопросы