2015-01-27 3 views
1

Perl DBI에서 IN 쿼리에 대한 SQL 세트에 변수를 바인드하려면 어떻게합니까?Perl DBI -리스트 바인딩

예 :

my @nature = ('TYPE1','TYPE2'); # This is normally populated from elsewhere 
my $qh = $dbh->prepare(
     "SELECT count(ref_no) FROM fm_fault WHERE nature IN ?" 
) || die("Failed to prepare query: $DBI::errstr"); 

# Using the array here only takes the first entry in this example, using a array ref gives no result 
# bind_param and named bind variables gives similar results 
$qh->execute(@nature) || die("Failed to execute query: $DBI::errstr"); 

print $qh->fetchrow_array(); 

TYPE1 만 카운트 위와 같은 결과 코드 결과, 필요한 출력 TYPE1TYPE2의 카운트의 합이된다. 바인드 항목을 @nature (\@nature)에 대한 참조로 바꾸면 결과가 0입니다.

주요 사용 사례는 사용자가 확인란 그룹과 같은 것을 사용하여 여러 옵션을 검사 할 수 있도록 허용하고 모든 결과를 반환하는 것입니다. 해결 방법은 쿼리에 삽입 할 문자열을 만드는 것입니다. SQL 인젝션 문제를 피하기 위해 많은 필터링이 필요하지만 추한 것입니다 ...

필자의 경우 데이터베이스는 Oracle입니다. 이상적으로는 데이터베이스의 영향을받지 않는 제네릭 솔루션이 필요합니다.

답변

2

에 요소가있는만큼 많은 ? 자리 표시자가 있어야합니다. in (?,?,..)

my @nature = ('TYPE1','TYPE2'); 
my $pholders = join ",", ("?") x @nature; 
my $qh = $dbh->prepare(
    "SELECT count(ref_no) FROM fm_fault WHERE nature IN ($pholders)" 
) or die("Failed to prepare query: $DBI::errstr"); 
+0

재미있는 방법 ...하지만 이름이 바인드 변수에 대한 작동하지 않습니다 ... (나는 최대한의 예를 단순화하려고 내 전체 쿼리 내가 사용하고 몇 가지 반복 변수가 오라클 스타일': name' 변수) ('?'와 명명 된 타입을 혼합 할 수 있을지 궁금합니다 ...) 집합 /리스트를 직접 바인드하는 방법이 있기를 바라고 있습니다 ... –

+0

AFAIK, Oracle 용으로 명명 된 자리 표시 자만 사용합니다. –

+0

다른 드라이버와 함께,': 1',': 2' 등등을 사용할 수 있습니다 ... –