学习Perl DBI -- 处理返回记录(Fetch)

    在Perl中, 如果你的记录确保只有一条记录被返回, 则可以用以下的更简单的方法, 而不需要经过Prepare-Bind-Execute-Fetch四个阶段, 如下所示:

my ($iniext, $nxtext) = $dbh->selectrow_array (
   "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES
       WHERE TABLESPACE_NAME='USERS'");

my ($iniext, $nxtext) = $dbh->selectrow_array (
   "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES
       WHERE TABLESPACE_NAME=?", undef, "USERS");

my @row = $dbh->selectrow_array (
   "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES
       WHERE TABLESPACE_NAME=?", undef, "USERS");

my $rowref = $dbh->selectrow_arrayref (
   "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES
       WHERE TABLESPACE_NAME=?", undef, "USERS");

    在返回多行时, 前面说的一条一条地获取就会增加网络的来回访问, 使用一批一批(Batch)地Fetch将极大地提高性能. 可以使用selectall_arrayref或fetchall_arrayref来一次取得所有的记录放在本地的内存中, 如下所示:

$sth = $dbh->prepare(...);
$sth->execute();
my $rows = $sth->fetchall_arrayref();
foreach my $row (@$rows)
{
   my ($col1, $col2, ...) = @$row;
   ...
}

my $rows = $dbh->selectall_arrref(
  "select ts#, tablespace_name from v$tablespace");
......
  
my $rows = $dbh->selectall_arrref(
  "SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME=?",
  undef, "TEST");
......

    我们可以看到同取得单行不一样的是, 没有fetchall_hashref这个函数, 但fetchall_arrayref也可以将记录以hash的方式返回. 如一个查返回col1, col2, col3, 则下面的代码返回的每一行记录就是一个hash:

my $rows = $sth->fetchall_arrayref(
   col1=>1, col2=>1,   col3=>1 };
  
foreach my $row (@$rows)
{
   print($row->{col2});
   print($row->{col1});
}

    但这种将所有记录一次拉到客户端内存的方式在数据量大的情况是不行的, 因此我们需要能指定一次fetch返回多少条记录, 可以用如下方法:

my $BATCH_SIZE=100;
......
my $last_fetch = 0;
while(!$last_fetch)
{
   $array_ref = $sth->fetchall_arrayref(undef, $BATCH_SIZE);
   $last_fetch = 1 if (@$array_ref < $BATCH_SIZE);
}
......

    知道了这些之后, 用Perl来处理数据库的数据就容易多了.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Can I use the lift?
  • 我能用电梯吗?
  • Sorry, it's broken. You have to use the stairs.
  • 对不起, 它坏了, 你只能走楼梯了.
  • Where are the stairs?
  • 楼梯在哪里呢?
  • Go along the corridor and it's on your right side.
  • 沿着走廊走, 在你右手边.
  • Thank you for directions.
  • 感谢你为我指路.