Re: DBD::Oracle 11gr2 ORA-38909

2010-04-06 Thread Martin Evans
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


Re: DBI package problem?

2010-04-06 Thread rosenfield . albert
Here's a code example (attached).

Extract it to some folder.  Run the tests with Perl.  Doesn't include
an installer, so remember to include the library folder, FBI:

$ perl -IFBI/ 00_test.pl
message from XS core!
$ perl -IFBI/ 01_test.pl
another message from XS core!

You can set the FBI_PUREPERL environment variable to force usage of
XS, Perl or Automatic mode:

$ export FBI_PUREPERL=0
$ perl -IFBI/ 00_test.pl
message from XS core!

$ export FBI_PUREPERL=1
$ perl -IFBI/ 00_test.pl
message from XS core!

$ export FBI_PUREPERL=2
$ perl -IFBI/ 00_test.pl
message from PurePerl core!

If the XS core fails to load for some reason (if you want to try you
can put some random garbage in the XS module), a warning is displayed
and the PurePerl core is used instead.


fbi_example.tar.gz
Description: GNU Zip compressed data


Re: DBD::Oracle 11gr2 ORA-38909

2010-04-06 Thread Scott T. Hildreth
On Tue, 2010-04-06 at 09:51 +0100, Martin Evans wrote:
 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?

Yes.


  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.

I don't either, I was looking at other attributes and how they are in
the code.  That's why I asked for direction, :-)

  Do you mean dbd_st_prepare in
 oci8.c.


I think John is going to add this attribute, but I will give it a whirl
for the sake of learning more about DBD::Oracle.

Thanks.
 
  
  Thanks,
  Scott
  
  
   An attribute in the prepare method?  
 
  Thanks,
  Scott
  
  
 
 Martin