全部博文(1144)
分类:
2010-05-31 13:57:51
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来处理数据库的数据就容易多了.