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

时间:2012-06-22 14:28:57

标签: perl bash dbd

一点背景: 我有一个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'而不是 '间隔?'

1 个答案:

答案 0 :(得分:4)

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

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

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

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