Perl DBI:如何查看带有绑定值的失败查询?

时间:2011-06-24 01:41:28

标签: perl dbi

这是DBI手册中的标准插入示例:

     my $query = q{
       INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };
     my $sth = $dbh->prepare($query) or die $dbh->errstr;
     while (<>) {
         chomp;
         my ($product_code, $qty, $price) = split /,/;
         $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr);
     }
     $dbh->commit or die $dbh->errstr;

我修改了一下,所以我可以看到哪个查询失败(die ($query . " " . $dbh->errstr))。我仍然希望查看带有绑定值的查询 (因为它已执行)。如何获得它?


修改

顺便说一下,我发现了一种查看绑定值查询的尴尬方法:你必须在查询中出现语法错误。例如,如果我更改上面的查询:

     my $query = q{
       xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };

我按照自己的意愿收回了它:

  

DBD :: mysql :: st执行失败:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在'xINSERT INTO示例(product_code,qty,price)附近使用正确的语法VALUES('1','2','3')'在第1行

有时真的有帮助。至少它对我有用。

3 个答案:

答案 0 :(得分:3)

您可以使用DBI的ParamValues来获取参数值,但您不太可能在DBD中找到任何方法来获取SQL中的实际参数,因为它们主要在解析SQL后发送到数据库。您可以查看DBIx::Log4perl以查看错误处理程序中ParamValues的使用方式。您可能还会发现DBIx :: Log4perl的某些部分很有用。

答案 1 :(得分:1)

没有标准的方法可以做到这一点。最接近的近似值是用(可能引用的)值替换每个占位符。通常,很难可靠地解析SQL语句以查找作为占位符的问号,而不是分隔标识符或字符串或注释的部分。在示例中,您只需查找问号;但这并不总是有效:

INSERT /* ? */ INTO "??".Sales VALUES('?', ?, ?, ?);

请注意,对于大多数(但不一定是所有)DBMS(以及大多数DBD驱动程序),语句在准备好时会发送到DBMS;只有在执行语句时才会发送值。从未创建过将所有值替换为VALUES列表的语句,因此DBI和DBMS都不应该创建一个。

答案 2 :(得分:0)

我认为没有任何通用支持的DBI方法,但个别数据库驱动程序可能允许它。你在用什么数据库?