I haven't seen a reply to this yet but I've been on holiday so might
have missed it:

Scott T. Hildreth wrote:
> 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(),

Don't you mean dbd_st_FETCH_attrib as it is a statement level attribute
not a connection one? Anyway, I don't think it is required unless you
really want to get it back out in a Perl script.

I don't even think you need to add it to a statements
private_attribute_info but then when I checked Oracle.pm it appears a
load of prepare flags have been added. I might be wrong here but since
there is no way to get ora_parse_lang etc (prepare attributes) I don't
think they should be in private_attribute_info.

perl -e 'use DBI;$h =
DBI->connect("dbi:Oracle:host=xxx;sid=yyy","xxx","yyy"); $s =
$h->prepare("select 1 from dual", {ora_parse_lang => 2}); print
$s->{ora_parse_lang};'

prints nothing as you'd expect as there is no way to get ora_parse_lang.

>         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);

I don't understand why you need it in ora_st_execute_array - the
statement has already been parsed by then. Do you mean dbd_st_prepare in
oci8.c.

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

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to