On Wed, 2010-03-31 at 12:20 -0500, Scott T. Hildreth wrote:
> We have run into an issue with array processing in 11g.  The developer
> was using execute_array and his sql statement had 'LOG ERRORS' in it.
> This did not error out until we switched to 11g.  The issue is that only
> one is allowed, either 'LOG ERRORS' or 'SAVE EXCEPTIONS'.  Our DBA
> logged and error report with Oracle and after several posts back and
> forth this is what they concluded,
> 
> ======================================================================
> After investigation and discussion, development has closed the bug as
> 'Not a Bug' with the following reason:
> 
> "this is an expected behavior in 11g and the user needs to specify
> either of 'SAVE EXCEPTIONS' clause or the 'DML error logging', but NOT
> both together.
> The batch error mode, in the context of this bug, is basically referring
> to the SAVE EXCEPTIONS clause.
> It seems the code is trying to use both dml error logging and batch
> error handling for the same insert. In that case, this is not a bug.
> 
> For INSERT, the data errors are logged in an error logging table (when
> the dml error logging feature is used) or returned in batch error
> handles (when using batch mode).
> Since the error messages are available to the user in either case, there
> is no need to both log the error in the error logging table and return
> the errors in batch error handles, 
> and we require the user to specify one option or the other but not both
> in 11G.
> 
> Both features exist in 10.x. For 11.x, users should change their
> application to avoid the error.
> ======================================================================
> 
> So basically we need a way to turn off the 'SAVE EXCEPTIONS' for the
> batch mode.  I found in dbdimp.c that the oci_mode is being set to 
> OCI_BATCH_ERRORS in the ora_st_execute_array function.  I was planning 
> on setting it to OCI_BATCH_MODE and running a test to see if this will
> not error out.  I report back when I have run the test, but I was
> wondering what would be the best way to give the user the ability to
> override the oci_mode. 

Setting oci_mode to OCI_BATCH_MODE works.  So I want to add a prepare
attribute that will turn off the SAVE EXCEPTIONS.  I'm looking for some 
direction on how to add it to dbdimp.c. I haven't thought of a name yet,
but something like 

my $sth = $dbh->prepare($SQL,{ora_oci_err_mode => 0});

I assume I would have to add it to dbd_db_FETCH_attrib() and would I do
something like this in ora_st_execute_array(),

        if (DBD_ATTRIB_TRUE(attr,"ora_oci_err_mode",16,svp))
                DBD_ATTRIB_GET_IV(  attr, "ora_oci_err_mode",  16, svp, 
ora_oci_err_mode);



Thanks,
Scott


>  An attribute in the prepare method?  
> 
> Thanks,
> Scott

Reply via email to