use DBI; use strict; sub handle_error { my ($state, $msg, $native) = @_; print qq{handle_error: \$state is "$state".}, "\n"; print qq{handle_error: \$msg is "$msg".}, "\n"; print qq{handle_error: \$native is "$native".}, "\n"; return 0; } my $dbh = DBI->connect('dbi:ODBC:baugi','sa','easysoft', { #odbc_err_handler => \&handle_error, }); eval { local $dbh->{PrintError} = 0; $dbh->do("drop procedure t_raiserror"); }; $dbh->do(<<'EOT'); CREATE PROCEDURE t_raiserror (@p1 varchar(50), @p2 int output) AS set @p2=45; raiserror ('An error was raised. Input was "%s".', 16, 1, @p1) return 55 EOT sub test() { my $sth = $dbh->prepare("{? = call t_raiserror(?,?)}"); my ($p1, $p2) = ('fred', undef); $sth->bind_param_inout(1, \my $retval, 4000); $sth->bind_param(2, $p1); $sth->bind_param_inout(3, \$p2, 32); $sth->execute(); print qq/After execute:\n/; print "err=", $sth->err(), "\n"; print "errstr=", $sth->errstr(), "\n"; print "state=", DBI::neat($sth->state()), "\n"; print qq{\$retval is $retval.}, "\n"; print qq{\$p1 is $p1.}, "\n"; print qq{\$p2 is $p2.}, "\n"; } test(); $dbh->disconnect;