Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5361311
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类:

2010-05-31 13:57:51

  在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来处理数据库的数据就容易多了.

阅读(1558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~