在DBI的较新版本和DBD的最新版本(如: DBD Oracle V1.19)中就支持了Array DML操作, 这样可以大幅提高应用程序的性能, 在Perl中我们可以通过bind_param_array和execute_array来实现, 如下代码所示:

my (@rowstats, $rv);

$dbh->{AutoCommit} = 0;

my @col1 = (…..);
my @col2 = (…..);

my $sth = $dbconn->prepare(
    ”INSERT INTO T_PERLARRAY VALUES (?, ?)”);

$sth->bind_param_array(1, \@col1);
$sth->bind_param_array(2, \@col2);
$rv = $sth->execute_array(
    {ArrayTupleStatus => \@rowstats});

    如果执行成功, $rv将是执行的次数, 如果失败将会是undef. 而rowstats这个数据将返回每一次调用所影响的记录数, 但在Oracle中, 常常得不到这个数, 所有值都被置成-1. 如果有几行执行失败, 时那么rowstats中对应的值将是一个数组, 第一个值为错误代码, 第二个值为错误信息. 先来看一下成功的例子:

print(“Return: $rv\n”) if (defined($rv));
print(“Status: @rowstats\n”);

# Return: 5
# Status: -1 -1 -1 -1 -1

    现在假设数据组的第三个值太大, 不能插入到数据库中, 则输出如下:

print(“Return: $rv\n”) if (defined($rv));
print(“Status: @rowstats\n”);

# Status: -1 -1 ARRAY@… -1 -1

    用如下代码就可以取到错误代码和错误信息:

if (ref $rowstats[2])
{
  print(“errcode: $rowstats[2]->[0]\n”);
  print(“errmsg : $rowstats[2]->[1]\n”);
}

    有空时写个例子比较一下速度. 这个功能现在的Bug还比较多, 如PrintError设为0并不起作用等, 还得等以后的版本来修补.