2014-07-18 3 views
0

나는 sqlite 데이터베이스와 통신하기 위해 perl을 사용하고 있으며 오류가 발생합니다. 나는 (그들은 또한 많은 다른 '이상한 문자를'이 (변수 $ 약물에 저장) 화학 이름의 일부 그들에 쉼표가 있기 때문에 생각합니다.perl 쿼리 이름에 DBI 쉼표

어떤 도움을 주시면 감사하겠습니다

, 감사합니다.

**error message:** 
- read in 57to find CIDs for 
- Opened database successfully 
- retrieving results for cyclo(L-Val-L-Pro) 
- retrieving results for Sinapic_acid 
- retrieving results for NHQ 
- DBD::SQLite::db prepare failed: near ",": syntax error at get_drugName2IDinfo.sqlite.pl line 33. 
- DBD::SQLite::db prepare failed: near ",": syntax error at get_drugName2IDinfo.sqlite.pl line 33. 

라인 33 :

my $stmt = qq(SELECT * from chem_aliases WHERE alias LIKE '$drug%'); 

예 약품 이름 :

0,123,488,

부분 스크립트

my %HoDrugs; 
while (my $line=<IN>){ 
    chomp $line; 
    $HoDrugs{$line}=1; 
} 
close(IN); 
print "read in\t".scalar(keys %HoDrugs)."to find CIDs for\n"; 
## 
my $driver = "SQLite"; 
my $database = "/Users/alisonwaller/Documents/Typas/ext_data/STITCHv3.1/STITCHv3.1.sqlite.db"; 
my $dsn = "DBI:$driver:dbname=$database"; 
my $userid = ""; 
my $password = ""; 
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) 
        or die $DBI::errstr; 

print "Opened database successfully\n"; 
### 
my $outfile="$in_drugNms.sq.plsCIDs.tab"; 
open (OUT,">",$outfile); 
foreach my $drug (keys %HoDrugs){ 

    my $stmt = qq(SELECT * from chem_aliases WHERE alias LIKE '$drug%'); 
    my $sth = $dbh->prepare($stmt); 
    my $rv = $sth->execute() or die $DBI::errstr; 
    if($rv < 0){ 
      print $DBI::errstr; 
    } 
    while(my @row = $sth->fetchrow_array()) { 
      print "retrieving results for\t$drug\n";     
      print OUT join("\t",$drug,$row[0],$row[1],$row[2]) . "\n"; 
    } 
} 
    print "Operation done successfully\n"; 
    $dbh->disconnect(); 
+2

[Perl 사용? 작은 따옴표 안에 바인딩] (http://stackoverflow.com/questions/12773109/using-perl-bind-inside-single-quotes). –

+1

위험! http://bobby-tables.com/, [자리 표시 자/바인드 변수] (http://bobby-tables.com/perl.html) –

답변

0

당신은 항상 구두점 문자를 제거하려고하는 쿼리를 수행하기 전에 $drug =~ s/[[:punct:]]//g;를 사용하려고 할 수 있을까?

원하지 않으시면 공백으로 대체 하시겠습니까? $drug =~ s/,/ /g;

2

직접 문자열을 인용하는 대신 자리 표시자를 사용 해보 려 했습니까?

my $sth = $dbh->prepare('SELECT * from chem_aliases WHERE alias LIKE ?'); 
my $rv = $sth->execute($drug . '%') or die $DBI::errstr; 
+0

정답입니다. $ 약물 버퍼에 '%'를 추가하고 '?' 자리 표시 자 구문. –

+0

죄송합니다. 감사합니다 @ LenJaffe! 귀하의 수정 사항에 대한 답변을 업데이트했습니다. – oalders

+0

예쁘게 환영합니다 @oalders –