Ваш пример кода не работает (--purposely и отсутствует; пропущены кавычки в вызове do), и ошибка 42000 вызвана тем, что вы вызвали ошибку raiserror, которая называется «Неверный синтаксис рядом с ...».Я не могу сказать, потому что вы показываете реально работающий код.В любом случае, ваш код переписан так, как показано ниже:
use DBI;
use strict;
use warnings;
my $dbh = DBI->connect('dbi:ODBC:xxx','xx','xx');
$dbh->{RaiseError} = 1;
$dbh->{PrintError} = 1;
$dbh->begin_work;
eval {
#$dbh->do(INSERT INTO ..);
$dbh->do (q/RAISERROR ('User defined error',16,1)/); #--purposely raising error
$dbh->commit;
1;
};
if ($@) {
print $@;
print "err() ==>".$dbh->err();
print "errstr() ==>".$dbh->errstr();
print "state() ==>".$dbh->state();
$dbh->rollback or warn "rollback failed";
}
и выводит:
DBD::ODBC::db do failed: [unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000) at so1.pl line 16.
DBD::ODBC::db do failed: [unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000) at so1.pl line 16.
err() ==>1errstr() ==>[unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000)state() ==>42000