2012-06-01 43 views
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数据库具有不同的结构?

感谢您的帮助!

+1

你可以显示SQL,也可能是所涉及的表的定义? – choroba

+0

调试行清除 –

+0

SQL添加到顶部 – Kevin

回答

6

我猜你正在寻找一个先前尝试转储数据库。要获得第一列的所有值,然后是第二等的所有值,需要与您显示的程序完全不同的程序。

不要忘记你打开的文件为附加,这会在文件的开始处留下任何旧数据。我本来以为开放的代码在这里是合适的,因为失败尝试的输出没有什么价值。

我也使用

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

除了检查open的状态,除非你已经设置$\到一个换行符,你需要换行分隔的记录终止您的打印输出。写起来也比较容易

print "@row\n"; 

而不是提到每个字段显式。

+0

这很聪明,也很搞笑。我也被困在提供的代码如何产生输出的问题上,但我没有想到对代码产生输出的假设提出质疑。 – octern

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) ]}"); 
    } 
} 

神奇的是在切片,这将导致回报回来哈希裁判的数组引用。对我来说,性能开销是值得的,因为结果是这样的:

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

] 

阅读起来的perldoc DBI的更多信息

+0

这不解决问题 – Borodin

+0

我不知道为什么它不会解决问题?它确实防止了他所抱怨的行为。 –

+0

你能解释为什么原始解决方案不起作用吗?如果是的话请告诉我们。但否则,你不能说这是否会解决它。 – Borodin

相关问题