0

当我使用准备函数时,我正在使用 DBi 递归调用 DB 上的表,一切正常,但是当我使用 prepare_cached 时,我收到一条错误消息,提示 prepare_cached 失败

在我的代码片段下面

sub rec {

my $data = shift;
my $dbh = shift;

if($x eq 'foo') { 

return 1;
 }

my $query="select x from table where z =?";

my $sth=$dbh->prepare_cached($query);
$sth= $dbh->execute($data);

 while(my ($x)=$sth->fetchrow_array) {   
$rec($x,$dbh);

}

}

有人可以帮助可能是什么问题吗?

4

2 回答 2

2

问题是您正在迭代 $sth 并在执行此操作时再次递归并执行。因为这作用于相同的 $sth,所以这是行不通的(prepare_cached 将调用 $sth->finish,请参阅 DBI 文档)。

所以如果可能的话,把你的行放到一个数组中,做 $sth->finish 然后递归数组。或者使用普通的 prepare()。根据 DBS,这可能足够高效。

于 2012-06-04T22:51:55.403 回答
0

我认为在这种情况下,您应该为 prepare_cached 使用“$if_active”参数,可能将其设置为 3,如下所示: $sth = $dbh->prepare_cached($query, {}, 3) 这会做什么,但是,如果您的递归速度比查询完成的速度快,很可能,您可能从使用 prepare_cached 获得的任何性能提升都将丢失:如果缓存中的语句句柄仍在使用中,它将创建一个新句柄为你。

tinita 的建议听起来不错,但我要指出,通常没有任何理由调用 $sth->finish 自己(它本质上是错误命名的,实际上它的意思是“我已经完成了这个,所以把剩下的数据扔掉这套藏在服务器上”)。

于 2013-08-09T21:00:35.917 回答