为什么我的查询返回结果列而不是行?

时间:2012-06-01 16:44:07

标签: mysql database perl

有一个有效的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脚本,可以在他们的服务器/ db上运行。我无法直接测试它,但我将代码传递给他们的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数据库有不同的结构?

感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

我猜你正在考虑以前尝试转储数据库。要获取第一列的所有值,然后获取第二列的所有值,则需要与您显示的程序完全不同的程序。

不要忘记您正在打开追加的文件,这会在文件的开头留下任何旧数据。我原本认为 write 的开放在这里是合适的,因为失败尝试的输出没什么价值。

我还会使用

检查open的状态
open MYFILE, '>', 'data.txt' or die $!;

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

print "@row\n";

而不是提及每个领域的明确性。

答案 1 :(得分: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中,导致返回作为hash refs的arrayref返回。对我而言,性能开销是值得的,因为结果如下:

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

]

阅读perldoc DBI以获取更多信息