0

少し背景:ループ内でいくつかの操作を実行しているperlスクリプトがあります。

ループ内で、次のようなプリペアドステートメントを作成します。

  // inside loop
  my $statement = "select xxxx from zzzzzz where $foobar;";
  my $query = $connect->prepare($statement);
  $query->execute();

$ foobarはループが完了するたびに新しい値に更新されるため、実行するたびにクエリを変更したいのですが、そうしようとするとエラーが発生します。

スクリプトを実行すると、次のエラーが発生します。

  DBD::Pg::st execute failed: ERROR:  prepared statement "xxxxxxxxxxxxx" already exists at 

ループが実行されるたびに更新される変数を渡しているため、このプリペアドステートメントを使用する必要があると仮定すると、このエラーを回避するにはどうすればよいですか?

お時間をいただきありがとうございます。

編集:

この問題を抱えている将来の人々のために、ここでこれをチェックしてください:

私は取得しようとしていました

my $sth = $dbh->prepare('select interval ?');

http://gborg.postgresql.org/pipermail/dbdpg-general/2006-January/001972.html

http://gborg.postgresql.org/pipermail/dbdpg-general/2006-February/002007.html

いくつかの回避策をリストします。pg_server_prepareフラグを使用してサーバー側の準備をオフにするか、たとえばを使用します。'interval?'の代わりに'?::interval'

4

1 に答える 1

4

プリペアドステートメントをループの外に移動します。プリペアドステートメントに渡す必要のある変数がある場合は、?マーカーを使用して変数をプリペアドステートメントに渡します。次に例を示します。

my $stmt = $dbh->prepare('SELECT * FROM table WHERE id = ?');
foreach ... {

    my $var = <something>;
    $stmt->execute($var);
}

ここでは、プリペアドステートメントが1回作成され?、変数を渡すために使用されます。executeを呼び出すときは、変数をパラメーターとして渡します。

于 2012-06-22T14:35:24.063 に答える