On Wed, Jul 05, 2006 at 01:38:04PM +0100, Martin J. Evans wrote:
> Tim,
> 
> Thanks for the clarification and "untested" patch. I've tried it and it now
> fails (returns undef) and the HandleError routine is called. The error I'm
> getting now is:
> 
> executing ARRAY(0x8ce4c08) generated 1

D'oh. Thanks.

> Changing your patch to:
> 
> return $sth->set_err(1, "executing " . join(",", @{$tuple_status}) . "
> generated $err_count errors")
> 
> is every so slightly more useful, since it produces:
> 
> executing 1,ARRAY(0x981d698),1,1 generated 1 errors
> 
> which makes it obvious which row failed.

You might not think it more useful if the batch had 10,000 tuples in it!
I think I'll stick with just a count.

> The error handler gets a better error message of:
> 
> DBD::Oracle::st execute_array failed: executing 1,ARRAY(0x8869c08),1,1
> generated 1 errors [for Statement "insert into mytest values (?,?)" with
> ParamValues: :p1=53, :p2='one']

Um, including ParamValues is somewhat misleading in this situation.

> Just one note. This breaks t/15array.t around about line 48 because the test
> has RaiseError and PrintError turned on and expects the execute_array to fail.
> Turning them off before the test and back on again after fixes.

Thanks.

Try the attached patch on top of the previous one.

Tim.
Index: t/15array.t
===================================================================
--- t/15array.t (revision 6474)
+++ t/15array.t (working copy)
@@ -2,7 +2,7 @@
 
 use strict;
 
-use Test::More tests => 50;
+use Test::More tests => 52;
 
 ## ----------------------------------------------------------------------------
 ## 15array.t
@@ -45,7 +45,7 @@
 
 # -----------------------------------------------
 
-ok(!$sth->execute_array(
+ok(! eval { $sth->execute_array(
                { 
                        ArrayTupleStatus => $tuple_status 
                },
@@ -53,9 +53,11 @@
                42,                               # scalar 42 treated as array 
of 42's
                undef,                        # scalar undef treated as array 
of undef's
                [ qw(A B C) ],            # array of strings
-    ),
-       '... execute_array should return false'
+    ) },
+    '... execute_array should return false'
 );
+ok $@, 'execute_array failure with RaiseError should have died';
+like $sth->errstr, '/executing 3 generated 1 errors/';
 
 cmp_ok(scalar @{$rows}, '==', 2, '... we should have 2 rows');
 cmp_ok(scalar @{$tuple_status}, '==', 3, '... we should have 3 tuple_status');
Index: DBI.pm
===================================================================
--- DBI.pm      (revision 6616)
+++ DBI.pm      (working copy)
@@ -1932,7 +1932,7 @@
            }
        }
         my $tuples = @$tuple_status;
-        return $sth->set_err(1, "executing $tuple_status generated $err_count 
errors")
+        return $sth->set_err(1, "executing $tuples generated $err_count 
errors")
             if $err_count;
        return scalar(@$tuple_status) || "0E0";
     }

Reply via email to