簡體   English   中英

在Perl DBI模塊中獲取完整的錯誤消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM