2

有一个有效的 SQL 语句:

my $q_it = $dbh->prepare("SELECT customdata.Field_ID,
    customdata.Record_ID,
    customdata.StringValue
    FROM customdata
    WHERE customdata.Field_ID='10012' && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%');
   ");

我为我的客户编写了一个非常简单的 Perl 脚本,以便在他们的服务器/数据库上运行。我无法直接对其进行测试,但我将代码传递给了他们的 DBA:

  $q_it->execute();
   open (MYFILE, '>>data.txt');
    while (my @row=$q_it->fetchrow_array)
    {
       print MYFILE $row[0].$row[1].$row[2];
    }
   close (MYFILE);

$q_it 只是一个普通的 SQL Select 语句。我会假设 data.txt 将包含许多记录(行)。然而,令人惊讶的是,它在单列中返回结果,但有许多行,例如:

      100012
      100012
       ...
      100012
      315941
      315667
       ...
      315633 
      2011-06
      2011-06
       ...
      2011-06

几乎没有正确的。“100012”、“31”值和日期字符串的行数。理想情况下,它应该是

100012  315941 2011-06
100012  315667 2011-06
100012  315633 2011-06

可能是我在 Perl 中做错了什么,还是因为他们的 MySQL 数据库有不同的结构?

谢谢您的帮助!

4

2 回答 2

6

我猜您正在查看先前转储数据库的尝试。要获取第一列的所有值,然后是第二列的所有值,等等。需要一个与您显示的程序非常不同的程序。

不要忘记您正在为append打开文件,这将在文件开头留下任何旧数据。我原以为这里适合写入,因为失败尝试的输出没有什么价值。

我还会检查使用open状态

open MYFILE, '>', 'data.txt' or die $!;

除此之外,除非您设置$\了换行符,否则您需要用换行符终止打印输出以分隔记录。也更容易写

print "@row\n";

而不是明确提及每个字段。

于 2012-06-01T17:00:01.547 回答
0

我真的很喜欢使用这样的东西:

sub fetch_result_rows {
    my ($dbh, $sql, @bind_params) = @_; 
    try {
        return $dbh->selectall_arrayref($sql, { RaiseError => 1, Slice => {}, }, @bind_params);
    } catch {
        confess("Unable to run SQL:\n$sql\nBIND PARAMS: @{[ join(', ', @bind_params) ]}");
    }   
}

魔法就在 Slice 中,它导致返回作为哈希引用的数组引用返回。对我来说,性能开销是值得的,因为结果如下所示:

[
{ column1 => value, column2 => value, column3 => value }, # row1
{ column1 => value, column2 => value, column3 => value }, # row2
...

]

在 perldoc DBI 中阅读以获取更多信息

于 2012-06-01T16:50:50.797 回答