[英]Get full error message in Perl DBI module
我有一个像这样的Perl脚本:
use DBI;
eval {
my $dbh = DBI->connect("dbi:Oracle:<database>", "<user>", "<password>") or die ($DBI::errstr);
my $sth = $dbh->prepare("INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (?,?)");
$sth->execute( "foo", "bar" ) or die($dbh->errstr);
$dbh->disconnect;
};
my $err = $@;
print "\$err => $err\n";
当我运行它时,控制台产生以下输出:
DBD::Oracle::st execute failed: ORA-01722: invalid number (DBD ERROR: error possibly near <*> indicator at char 53 in 'INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (:<*>p1,:p2)') [for Statement "INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (?,?)" with ParamValues: :p1='foo', :p2='bar'] at C:\Temp\Perl-1.pl line 6.
$err => ORA-01722: invalid number (DBD ERROR: error possibly near <*> indicator at char 53 in 'INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (:<*>p1,:p2)') at C:\Temp\Perl-1.pl line 6.
我想存储完整的错误消息,但是变量$err
只包含ORA-01722: invalid number (DBD ERROR: error possibly near <*> indicator at char 53 in 'INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (:<*>p1,:p2)') at C:\\Temp\\Perl-1.pl line 6.
但我想得到[for Statement "INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (?,?)" with ParamValues: :p1='foo', :p2='bar']
缺失。
知道如何捕获这些额外信息吗?
查看PrintError属性的文档 。 它默认启用,这是将错误记录到控制台的原因。 它也是DBD::Oracle::st execute failed:
前缀的来源。
然后看看ShowErrorStatement属性 。 它也默认启用(在DBD :: Oracle但不是所有驱动程序中)并且是[for Statement "..." with ParamValues: :p1='foo', :p2='bar']
的源代码,其中[for Statement "..." with ParamValues: :p1='foo', :p2='bar']
后缀。
然后看看RaiseError属性 。 如果已设置,则DBI将在发生错误时抛出异常(包含您看到记录到控制台的消息)。 您可以捕获该异常并随意处理它。
通常,我强烈建议使用DBI的所有应用程序启用RaiseError。 它使您的应用程序更加强大,让您的生活更轻松。
ps对于高级用例,您可能需要查看HandleError属性,或者在极少数情况下使用HandleSetError属性。
根据给出的评论和答案,我找到了这些解决方案:
use DBI;
local $SIG{__WARN__} = sub {
my $err = shift;
print "\$err => $err\n";
};
my $dbh = DBI->connect("dbi:Oracle:<database>", "<user>", "<password>", { PrintError => 1, ShowErrorStatement => 1 } );
my $sth = $dbh->prepare("INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (?,?)");
$sth->execute( "foo", "bar" );
$dbh->disconnect;
和
use DBI;
eval {
my $dbh = DBI->connect("dbi:Oracle:<database>", "<user>", "<password>", { RaiseError => 1} );
my $sth = $dbh->prepare("INSERT INTO WT_APPCERT_LH (STATUS, APPCERT) VALUES (?,?)");
$sth->execute( "foo", "bar" );
$dbh->disconnect;
};
my $err = $@;
print "\$err =>\n$err\n";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.