如何解决“DBD::P g::st 执行失败:错误:准备好的语句已存在”错误



一点背景:我有一个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 标志或使用 eg。"?::间隔"而不是"间隔?"

将准备好的语句移到循环之外。 如果您有需要传递给预准备语句的变量,您将使用 ? 标记将变量传递给预准备语句。 下面是一个示例:

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

在这里,预准备语句创建一次,?用于传入变量。 调用 execute 时,将变量作为参数传入。

最新更新