繁体   English   中英

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

[英]How do I get around “DBD::Pg::st execute failed: ERROR: prepared statement already exists ” error

一些背景知识:我有一个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。 '?:: interval'而不是'interval?'

将准备好的语句移出循环。 如果您有一个需要传递给准备好的语句的变量,则使用? 标记,以将变量传递给准备好的语句。 这是一个例子:

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

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

在这里,准备好的语句仅创建一次,并且? 用于传递变量。 调用execute时,您将变量作为参数传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM