2013-09-25 1 views
2

DBL :: Oracle을 사용하여 Oracle 데이터베이스에 대해 SELECT를 실행하는 Perl 응용 프로그램이 있습니다.Perl 및 DBD :: Oracle - 가져올 수있는 행 수는 얼마입니까? RowsInCache?

그런 다음 어떤 행이 반환되었는지 확인하고 그 행을 기반으로 분기를 확인하고 싶습니다.

DBD :: Oracle의 rows() 메서드는 SELECT에 대해 (perldoc 및 테스트에 따라) -1을 반환하므로 MySQL에 대해 수행 할 작업이 작동하지 않습니다.

perldoc은 RowsInCache ("선택 항목에서 캐시의 페치되지 않은 행 수를 반환합니다.")를 호출하지만 내 데이터베이스 또는 명령문 핸들에서 호출하거나 검사하려고 시도하지 않습니다. 예컨대 :

if ($sth->RowsInCache > 0) 
if ($sth::RowsInCache > 0) 
if ($dbh->RowsInCache > 0) 
if ($dbh::RowsInCache > 0) 

내가 할 하나 또는 "초기화되지 않은 값의 사용" "개체 방법을 찾을 수 없습니다." 내 부분에 잘못된 구문이 있습니까?

나는 내가 원하는 것을 달성 떨어져 몇 가지 알고 있어요 :

  1. 첫째는 SELECT COUNT 할 행의 수를 보면 다음 실제 선택을한다. 그러나 이것은 명백하게 DB를위한 추가 작업입니다.

  2. 전화 할 경우

    $ 행 = $ sth-> fetchrow_hashref;

$ 행이 없을 경우 $ 행이 정의되지 않으며 테스트 할 수 있습니다. 그러나 당신의 의도는, 당신은 당신이 이미 행이 있는지 테스트하는 첫 번째 행을 인출 한 사실을 처리 할 수있는 몇 가지 바보 같은 논리를 포함하는 하나 가지고 ...

$sth->execute($some_bind); 
while ($row = $sth->fetchrow_hashref) { 

...이 같은 경우 헤이 데이터베이스, 당신은 어떤 행을해야합니까 "라고 몇 가지 쉬운 방법이 있어야처럼 단지 것 같으면 ....

$sth->execute($some_bind); 
$got_some_rows = 0; 
while ($row = $sth->fetchrow_hashref) { 
    $got_some_rows = 1; 
    # other stuff 
} 
$sth->finish; 
if ($got_some_rows == 0) { 

...하지만 세상의 끝이 아니다 : 나 같은 것을 할 나를 위해? "

나는 분명한 뭔가를 놓치고 있습니까?

감사합니다.

+0

'$ sth -> { 'RowsInCache'}'를 사용해 보셨습니까? 이것이 DBD 속성에 대한 일반적인 규칙이지만 Oracle 용을 특별히 사용하지 않았습니다. – AKHolland

답변

4
$sth->RowsInCache; # Wrong. Method call for non-existent method. 

$sth::RowsInCache; # Wrong. Looking for a variable $RowsInCache in package `sth' 

$sth->{RowsInCache} # Right. RowsInCache is an attribute accessed as hashref element. 

그러나, 당신이 원하는 무엇을 주어,이 힘이 보인다 나은 :

... 
$sth->execute; 
while (my $row = $sth->fetchrow_hashref) { 
    do_stuff_with($row); 
} 
if ($sth->rows == 0) { 
    handle_the_case_where_there_were_no_results(); 
} 
... 

는 일반적으로, DBI 드라이버가 모든 행이 페치왔다 rows()이 합리적 일 것이라는 점을 보장 만 할 수

, 하지만 여기에 귀하의 경우에 적용됩니다.

+0

고마워요! 흥미롭게도 DBD :: mysql의 경우 rows()는 SELECT가 찾은 행 수를 즉시 반환합니다. 바로 다음 행의 명령문 핸들과 행()에 대해 execute()를 호출하고 올바른 번호를 얻을 수 있으며 이후의 fetchrow_hashrefs로 인해 변경되지 않습니다. – raindog308

+0

@ raindog308, 그렇습니다. 그러나 기본 동작 [mysql_use_result] (http : //search.cpan.)을 변경하면 다른 동작이 나타날 것입니다.org/dist/DBD-mysql/lib/DBD/mysql.pm # mysql_use_result)를 true로 설정하십시오. – pilcrow