有一个有效的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数据库有不同的结构?
感谢您的帮助!
答案 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以获取更多信息