2012-08-28 69 views
2

我在Ubuntu 10.04上运行Perl 5.10并使用perl DBI模块。 我想在Perl DBI下的SQL Query的“WHERE”子句中使用“AND”条件。我正在使用DBD :: CSV驱动程序。Perl DBD :: CSV - SQL语法 - “AND”子句无法正常工作

请consoider以下test.csv:

OS,RELEASE,VERSION 
Ubuntu,Warty,4 
Ubuntu,Hoary,5 
Ubuntu,Breezy,5 
Fedora,Yarrow,1 
Fedora,Tettnang,2 
Fedora,Stentz,4 

在这里我要检索的Fedora Stentz版本。 这里是我的代码:

#!/usr/bin/perl -w 

use strict; 
use DBI; 

my $table = "test.csv"; 

my $dbh = DBI->connect ("dbi:CSV:") or die "Cannot connect to the CSV file: $DBI::errstr()"; 
$dbh->{RaiseError} = 1; 
$dbh->{TraceLevel} = 0; 

my $query = "select VERSION from $table where OS='Fedora' and RELEASE='Yarrow'"; 
my $sth = $dbh->prepare ($query); 
$sth->execute(); 
$sth->dump_results(); 
$sth->finish(); 
$dbh->disconnect(); 

这里是hte输出;

0 rows 

如果我在查询中使用占位符代替,如下实际值:

my $query = "select VERSION from $table where OS=? and RELEASE=?"; 
my $sth = $dbh->prepare ($query); 
$sth->execute ('Fedora', 'Yarrow'); 
$sth->dump_results(); 
$sth->finish(); 
$dbh->disconnect(); 

则输出是错误的,如下:

DBD::CSV::st execute failed: You passed 2 parameters where 0 required [for Statement "select VERSION from test.csv where OS=? and RELEASE=?"] at count.pl line 14. 
DBD::CSV::st execute failed: You passed 2 parameters where 0 required [for Statement "select VERSION from test.csv where OS=? and RELEASE=?"] at count.pl line 14. 

但如果我只用在WEHRE子句中的一个条件如下,那么该脚本给我正确的输出:

my $query = "select VERSION from $table where OS=?"; 
my $sth = $dbh->prepare ($query); 
$sth->execute ('Fedora'); 
$sth->dump_results(); 
$sth->finish(); 
$dbh->disconnect(); 

而且兴田输出为:

'1' 
'2' 
'4' 
3 rows 

因此,底线,我的问题是,当我写的“其中”条款的“和”的条件,这是行不通的。我怀疑我的查询语法有什么问题,但无法解决这个问题。任何指针或建议都会有很大的帮助。

另外,我对perlmonks对同一问题的正在执行的线程:http://www.perlmonks.org/?node_id=990214

感谢。

回答

3

你所有的代码片段对我来说都很好。确保你的模块是最新的。从Devel::VersionDump(呼叫出口处):

Perl version: v5.16.0 on linux (/home/eric/usr/perlbrew/perls/5.16.0t/bin/perl) 
AutoLoader      -  5.72 
Carp       -  1.26 
Clone       -  0.31 
Config       - Unknown 
Cwd        - 3.39_02 
DBD::CSV      -  0.36 
DBD::File      -  0.40 
DBI        - 1.620 
DBI::DBD::SqlEngine    -  0.03 
DBI::SQL::Nano     - 1.014600 
Data::Dumper     - 2.135_06 
Devel::VersionDump    -  0.02 
DynaLoader      -  1.14 
Errno       -  1.15 
Exporter      -  5.66 
Exporter::Heavy     -  5.66 
Fcntl       -  1.11 
File::Basename     -  2.84 
File::Spec      - 3.39_02 
File::Spec::Unix    - 3.39_02 
IO        - 1.25_06 
IO::File      -  1.16 
IO::Handle      -  1.33 
IO::Seekable     -  1.1 
List::Util      -  1.23 
Params::Util     -  1.07 
SQL::Dialects::AnyData   -  1.33 
SQL::Dialects::Role    -  1.33 
SQL::Eval      -  1.33 
SQL::Parser      -  1.33 
SQL::Statement     -  1.33 
SQL::Statement::Function  -  1.33 
SQL::Statement::Functions  -  1.33 
SQL::Statement::Operation  -  1.33 
SQL::Statement::Placeholder  -  1.33 
SQL::Statement::RAM    -  1.33 
SQL::Statement::Term   -  1.33 
SQL::Statement::TermFactory  -  1.33 
SQL::Statement::Util   -  1.33 
Scalar::Util     -  1.23 
SelectSaver      -  1.02 
Symbol       -  1.07 
Text::CSV_XS     -  0.91 
Tie::Hash      -  1.04 
XSLoader      -  0.16 
base       -  2.18 
bytes       -  1.04 
constant      -  1.23 
overload      -  1.18 
overloading      -  0.02 
sort       -  2.01 
strict       -  1.07 
unicore::Heavy.pl    - Unknown 
unicore::lib::Perl::Word.pl  - Unknown 
unicore::lib::Perl::_PerlIDS.pl - Unknown 
utf8       -  1.09 
utf8_heavy.pl     - Unknown 
vars       -  1.02 
warnings      -  1.13 
warnings::register    -  1.02 
+0

这太快捷了。我浪费了整整一天的工作时间,结果竟然是螺丝模块。根据你的建议,当我运行VersoinDump时,两个模块“SQL :: Statement”和“SQL :: Parser”表示“未知”,其他所有人都显示了一个版本号。所以我重新安装了“SQL :: Statement”并运行了VersionDump,并且显示了版本号。后来我的脚本也运行良好。非常感谢你的时间和帮助ikegami。我从未想过在我最疯狂的梦中,这是一个腐败的模块问题。谢谢 !!! – slayedbylucifer