Perl和DBD :: Oracle - 可以获取多少行? RowsInCache?

时间:2013-09-25 15:40:09

标签: oracle perl dbi

我有一个perl应用程序,它使用DBD :: Oracle对Oracle数据库执行SELECT。

然后我想检查是否返回了任何行,并根据该行进行分支。

DBD :: Oracle的rows()方法为SELECT返回-1(根据perldoc和我的测试),所以我为MySQL做的事情将不起作用。

perldoc提到RowsInCache(“返回缓存中未取出的行数以供选择”),但尝试从我的数据库或语句句柄调用或检查它不起作用。 E.g:

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

我得到“无法找到对象方法”或“使用未初始化的值”。我的语法错误了吗?

我知道有几种方法可以完成我想要的东西:

  1. 首先执行SELECT COUNT,查看行数,然后执行真正的SELECT。但这显然是DB的额外工作。

  2. 如果你打电话

    $ row = $ sth-> fetchrow_hashref;

  3. 如果没有行,那么$ 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 ) {
    

    ......这不是世界的尽头,但是......如果看起来应该有一些简单的方法来说“嘿数据库,你有任何行吗?”

    我错过了一些明显的东西吗?

    谢谢!

1 个答案:

答案 0 :(得分: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()是明智的,但这适用于您的情况。