2010-07-21 3 views
3

내 코드에서 비슷한 조건의 간단한 sql 쿼리를 수행해야합니다. 나는이 방법perl, dbi와 같은 조건의 SQL 문

my $out = "/Users/zero/out.log"; 
my $filename = "/Users/zero/data.txt"; 


my $dbh = DBI->connect("DBI:Oracle:sid=$sid;host=$host;port=$port", $user, $pwd) or die "Couldn't connect to database: " . DBI->errstr; 
my $query = "select SOMETHING from SOMETHING_1 where SOMETHING like ?||'%' "; 
my $sth = $dbh->prepare($query) or die "Connection Error: " . $dbh->errstr; 
open (IN,"< $filename") or die("Unable to open $filename");   
my @righe = <IN>; 
close IN; 
open (OUT,">$out") or die "Unable to open $out"; 
foreach my $riga (@righe) { 
     chomp $riga; 
     (my $valore) = split (/\n/, $riga); 
     $sth->execute($valore) ||print "Impossibile eseguire la query $query"; 
     while (my $real = $sth->fetchrow_array) { 
         print OUT "\"$real\"\n"; 
        } 
    } 
$sth->finish; 
$dbh->disconnect(); 

하지만 쿼리에서 할 것 등의 조건을 무시하고 모든 행을 반환합니다. 내 잘못은 어디입니까?

감사의

+2

어휘 파일 핸들과 3 개의 파일 열기를 사용하십시오. 예 : open (my $ in, '<', $ filename) 또는 죽습니다 ...; # 3 파일 열기로 취약성과 어휘 제한을 막을 수 있습니다. http://perldoc.perl.org/functions/open.html – xenoterracide

+0

오랫동안 긴 줄과 공백을 끊는 것이 좋습니다. – xenoterracide

답변

7

검색하는 변수에 % char을 연결해야합니다.

my $query = "select SOMETHING from SOMETHING_1 where SOMETHING like ?"; 
... 
$sth->execute($valore.'%') ||print "Impossibile eseguire la query $query"; 
+0

오케이, 지금해볼 게. 나는 '%'하지만 내 $ 쿼리에 concat하려고했습니다. – zebra

+2

'$ valore' 변수를 자동으로 인용하는'?'자리 표시자를 사용하므로 쿼리에서'%'문자를 사용할 수 없습니다. 즉, * 쿼리 *에서'%'를 사용하면''somevalue "%''처럼 보이고''somevalue % ''처럼 보일 것입니다. – Jonas

+0

@Jonas 지금까지 같은 문제에 직면했기 때문에 정말 도움이되었습니다. 건배. – aki2all