2013-09-25 48 views
2

我有一個perl應用程序,它使用DBD :: Oracle對Oracle數據庫執行SELECT。Perl和DBD :: Oracle - 可提取多少行? RowsInCache?

然後我想檢查是否有任何行被返回,並基於此分支。對於SELECT(根據perldoc和我的測試),Oracle的rows()方法返回-1,所以我爲MySQL做的事情將不起作用。

perldoc提到RowsInCache(「返回高速緩存中未選取行的數目」),但試圖從我的數據庫或語句句柄調用或檢查該行不起作用。例如:

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

我得到「無法找到對象方法」或「使用未初始化的值」。我的錯誤語法?

我所知道的一對夫婦的方式關閉完成我想要的東西:

  1. 首先做一個SELECT COUNT,看看行數,然後做真正的選擇。但這對於數據庫來說顯然是額外的工作。

  2. 如果你打電話

    $行= $ sth-> fetchrow_hashref;

然後,如果沒有行並且您可以測試該行,$ row將是未定義的。不過,如果你的目的是這樣的......

$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(),在下一行調用rows()並獲取正確的數字,並且由於隨後的fetchrow_hashrefs而不會更改。 – raindog308

+0

@ raindog308,是的,但你會看到不同的行爲,我認爲,如果你改變默認['mysql_use_result'](http://search.cpan。org/dist/DBD-mysql/lib/DBD/mysql.pm#mysql_use_result)爲true。 – pilcrow