2

こんな問い合わせがあります

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;

heidi (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";
}
4

2 に答える 2

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';
于 2012-06-08T16:13:21.163 に答える
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;
...

1 つのクエリで複数のステートメントを実行することはできません。

于 2012-06-08T16:15:31.210 に答える