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 に答える