As long as RaiseError is turned OFF ($dbh->{RaiseError} = 0),
you may trap the errors without evals. The error message will change
based on the database.
PostgreSQL Example:
#!/usr/bin/perl -w
#
#
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect() or die $DBI::errstr;
# To trap errors, without using eval turn RaiseError OFF
$dbh->{PrintError} = 0; $dbh->{RaiseError} = 0; $dbh->{Warn} = 0;
# Drop the test table.
$dbh->do( q{drop table userids} ); # Ignore results (table may not exist)
# Create test table.
$dbh->do( q{CREATE TABLE userids (
user_id character varying(64) NOT NULL)}) or
die "Unable to create: " . $dbh->errstr;
# Add primary key.
$dbh->do( q{ALTER TABLE ONLY userids
ADD CONSTRAINT userids_pkey PRIMARY KEY (user_id)}) or
die "Adding primary key failed " . $dbh->errstr;
# List of users to add.
my @users = qw/tal skl atl rml pth tal/;
foreach my $user (@users) {
# Insert the user.
my $added = $dbh->do( q{insert into userids values (?)}, undef, $user );
# Check an error
if ($dbh->err) {
# Does the error message contains the phrase: duplicate key
if ($dbh->errstr =~ m/duplicate\skey/i) {
print "User $user already exists\n";
} else {
print "Error: ", join( " ", $dbh->state,$dbh->err,
$dbh->errstr, "\n");
}
} else {
print "Added user $user\n";
}
}
$dbh->disconnect;
exit;
On Fri, Sep 26, 2003 at 08:47:46PM -0400, [EMAIL PROTECTED] wrote:
> You can wrap it in an exec block and then check $@ after completion, like this:
>
> eval {
> $sth_ins_user->execute(
> $user_id,
> $username,
> $password
> );
> };
>
> if ($@) {
> # custom error-handling
> $dbh->rollback();
> $dbh->disconnect();
>
> if ($@ =~ /^DBD::ODBC::st execute failed: \[Oracle\]\[ODBC\]\[Ora\]ORA-
> 00001: unique/) {
> print 'That username has already been selected';
> DieOnError($msg);
> }
> else {
> print "Other error";
> }
> exit();
> }
>
>
> The specific syntax of what you need to check for in $@ is DB-specific, so the
> code here will only work for Oracle.
>
> Paul
>
> Quoting [EMAIL PROTECTED]:
>
> > I am just begginning to utilize perl w/apache. Since the amount of
> > documentation for perl is so overwhelming, I hope this list can help me
> > out.
> >
> > Question: How can I determine that a failure on insert is caused by
> > duplicate value/primary keys? I would like to handle this specific failure
> > separately from other failure.
> >
> > thanks,
> > -rkl
> >