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