FYI, my original vision for this was that the Oracle::OCI module would
provide full access to the (vast and powerful) Oracle OCI API.

DBD::Oracle and Oracle::OCI work together such that any Oracle::OCI
function that needs an OCI handle can be given a suitable DBI handle.

Here's an example using OCILobRead and OCILobWrite to edit a lob in
chunks. Notice how $dbh is used to supply the relevant handles:

for ( my $offset=1; $chunk == 5 ; $offset += $chunk ) {
    OCILobRead($dbh, $dbh, $lob_locator, $chunk, $offset,
                oci_buf_len($lob_buf, 200, \$chunk), 0,0, 0,0 );
    $lob_buf =~ s/old/new/g;
    $status = OCILobWrite($dbh, $dbh, $lob_locator, length($lob_buf), $offset,
                oci_buf_len($lob_buf), OCI_ONE_PIECE, 0,0, 0, 1 )
        if $chunk;
    warn get_oci_error($dbh, $status, 'OCILobWrite') if $status != OCI_SUCCESS;
}

For more examples, including OCIDescribeAny, see 
http://search.cpan.org/src/TIMB/Oracle-OCI-0.06/05dbi.t

If someone else would like to take over maintenance of Oracle::OCI
I'd be very happy. It deserves to be more widely used.

Tim.

On Mon, Apr 09, 2007 at 02:33:41PM -0400, John Scoles wrote:
> Well I have been hacking this one to death this weekend.  Did manage to get 
> it to work using a SP that creats a lob pointer before we do the update but 
> this is a very bad hack on my part.  I think this will require lob locators 
> as the function SYS.XMLType.CREATEXML requires all the CLOB there before it 
> runs,  So we might have to
> 
> 1) prepare the SQL
> 2) upload the CLOB
> 3) bind
> 4) execute the statment.
> 
> I do not like this myself.
> 
> I will look at the Lob locators and see if I can work it out with that later 
> this week.
> 
> cheers All
> 
> ""John Scoles"" <[EMAIL PROTECTED]> wrote in message 
> news:[EMAIL PROTECTED]
> > Sorry to be a Johnny come lately on this (pun intended)
> >
> > I have been playing with this myself and like you chaps have come up with 
> > a blank.  End up with ORA-00942 error
> >
> > I did spend some time to see how the python guys did it but as I can see 
> > they just did it as a cursor which I think we can do as well in 
> > DBD::Oracle. It is too late at night for me to give it a try though.
> >
> > I have stepped though all the code and can see nothing awry.
> >
> > I think our only alternative is to build up the clob in hunks then try to 
> > run it using the LOB Locator Methods  We could indicate this with a new 
> > ORA type called ORA_XMLTYPE or alike????
> >
> > Cheers
> >
> > Of by the way any of you going the 
> > http://vienna.yapceurope.org/ye2007/index.html  YAPC in Viena in Aug.
> >
> >
> > ""Garrett, Philip (MAN-Corporate)"" <[EMAIL PROTECTED]> wrote in 
> > message news:[EMAIL PROTECTED]
> > I ran this against v1.19 and had the same limit.
> >
> > -----Original Message-----
> > From: Paul Gallagher [mailto:[EMAIL PROTECTED]
> > Sent: Friday, February 16, 2007 8:25 PM
> > To: Garrett, Philip (MAN-Corporate)
> > Cc: Reidy, Ron; dbi-users@perl.org
> > Subject: Re: :Oracle - Any advance on inserting CLOB to XMLTYPE?
> >
> > Thanks Philip for the extra info.
> >
> > I've attached a test case I'm working with .. wondering if anyone
> > using DBD 1.19 can try this out too and report the results?
> >
> > Ron, can you check this also ... maybe your code is different in some
> > way?
> >
> > For me the limit is at 63/64 elements (results are in the file)
> >
> > perl xmltypeinsert-testcase.pl ORCL scott tiger 63
> > - is ok
> > perl xmltypeinsert-testcase.pl ORCL scott tiger 64
> > - fails
> >
> >
> > On 2/13/07, Garrett, Philip (MAN-Corporate) <[EMAIL PROTECTED]>
> > wrote:
> >>
> >> I can confirm I have the same problems as Paul when inserting large
> >> XMLType.
> >>
> >> Running on:
> >> 1.  SUSE LINUX Enterprise Server 9 (i586)
> >> 2.  DBI v1.50
> >> 3.  DBD::Oracle v1.18
> >> 4.  Oracle client: 9.2.0.4.0
> >> 5.  Oracle server: 9.2.0.7.0 - 64bit
> >>
> >> Regards,
> >> Philip
> >>
> >> Paul Gallagher wrote:
> >> > Thanks for the info Ron. I think you may not have quite hit the
> > limit
> >> > though.
> >> >
> >> > I tried your code (are you explicitly typing the bind to
> > :file_header?
> >> > I'm assuming not), and for small data sizes its ok, but once I go
> > very
> >> > large it fails.
> >> >
> >> > # fyi, I'm creating a long structure like this. max i 10 is ok, max
> > i
> >> > 3000 is not:
> >> > my @books;
> >> > my %dslong;
> >> > for (my $i=1; $i<3000; $i++) {
> >> >       push(@books, {id => $i, title => [ "the book $i title" ] } );
> >> > }
> >> > $dslong{"book"} = [EMAIL PROTECTED];
> >> > # and binding like this:
> >> > $sth->bind_param(":file_header", XMLout( \%dslong , RootName =>
> >> > "books") );
> >> >
> >> > NB: I'm presently testing this with DBD-Oracle-1.17 and DBI-1.52-r1
> > on
> >> > Windows (ActiveState)
> >> >
> >> > On 2/13/07, Reidy, Ron <[EMAIL PROTECTED]> wrote:
> >> >> Well, it works for me out of the box as advertised.
> >> >>
> >> >> Code snippet:
> >> >>
> >> >>  my $sth_admin_audit_files = $dbh->prepare(qq{
> >> >>    INSERT INTO array_audit.admin_audit_files
> >> >>      (instance_id
> >> >>      ,file_crdt
> >> >>      ,fname
> >> >>      ,file_header
> >> >>      ,file_header_raw
> >> >>      )
> >> >>    VALUES
> >> >>      (:instance_id
> >> >>      ,TO_DATE(:file_crdt, 'DD/MM/YYYY HH24:MI:SS')
> >> >>      ,:fname
> >> >>      ,SYS.XMLType.CREATEXML(:file_header)
> >> >>      ,:file_header_raw
> >> >>      )
> >> >>    RETURNING admin_audit_file_id, crmo
> >> >>    INTO      :admin_audit_file_id, :crmo
> >> >>  }) || die $DBI::errstr;
> >> >>
> >> >> Running on
> >> >>
> >> >> 1.  RH Linux 3.0 and 4.0
> >> >> 2.  DBI v1.47
> >> >> 3.  DBD::Oracle v1.16
> >> >> 4.  Oracle v9.2.0.5.0; v10.2.1.0.3; v10.2.0.2.0
> >> >>
> >> >> My files are around the order of 37Kb in size and I do nothing
> >> >> special
> >> >> with them (aside from convert the text into XML).  My user has only
> >> >> insert on the table with the XMLTYPE in it.
> >> >>
> >> >> Does the user running the Perl program have INSERT privs on the
> >> >> table?
> >> >> Is there a synonym issue or a role issue?
> >> >>
> >> >> --
> >> >> Ron Reidy
> >> >> Lead DBA
> >> >> Array BioPharma, Inc.
> >> >>
> >> >>
> >> >> -----Original Message-----
> >> >> From: Paul Gallagher [mailto:[EMAIL PROTECTED]
> >> >> Sent: Monday, February 12, 2007 12:04 PM
> >> >> To: dbi-users@perl.org
> >> >> Subject: DBD::Oracle - Any advance on inserting CLOB to XMLTYPE?
> >> >>
> >> >> It seems the current state of affairs is that for inserting to
> >> >> XMLTYPE
> >> >> fields:
> >> >> a) for <32k, can just insert text
> >> >> b) for >32k, must insert to CLOB, then use a procedure to update
> >> >> XMLTYPE (see
> >> >>
> >> http://www.issociate.de/board/post/206125/DBD::Oracle_and_XMLType.html
> >> >> for a summary of the details)
> >> >>
> >> >> Personally I've tried just about every trick in the book to try and
> >> >> get a direct-insert of large xml documents into xmltype fields, but
> >> >> to
> >> >> no avail.
> >> >>
> >> >> What troubles me is that this _should_ work:
> >> >> # NB: CREATE TABLE tryit ( formname VARCHAR(25), x XMLTYPE )
> >> >> INSERT INTO tryit  (formname, x) VALUES (?, XMLTYPE(?))"
> >> >>
> >> >> $sth = $dbh->prepare( "INSERT INTO tryit  (formname, x) VALUES (?,
> >> >> XMLTYPE(?))" );
> >> >> $sth->bind_param(1,  "INSERTXMLTYPE" );
> >> >> $sth->bind_param(2, XMLout( \%dslong , RootName => "books"), { TYPE
> >> >> =>
> >> >> SQL_CLOB } );
> >> >> $sth->execute  or warn "INSERTXMLTYPE creation failure";
> >> >>
> >> >> but it actually just gives ORA-00942: table or view does not exist.
> >> >> this is a bogus message (search metalink for "XMLTYPE ORA-00942").
> >> >> try
> >> >> an alternative like "INSERT INTO tryit  (formname, x) VALUES (?,
> >> >> XMLTYPE(CAST(? as CLOB)))" and you get ORA-00932: inconsistent
> >> >> datatypes.
> >> >>
> >> >> All of the above is old news I think.
> >> >>
> >> >> Why I raise this now is that I discovered the python guys seem to
> >> >> have
> >> >> got it working OK. See
> >> >> http://blog.gmane.org/gmane.comp.python.db.cx-oracle/month=20050401
> >> >>
> >> >> connection = cx_Oracle.Connection("user/pw <at> tns")
> >> >> cursor = connection.cursor()
> >> >> cursor.setinputsizes(value = cx_Oracle.CLOB)
> >> >> cursor.execute("insert into xmltable values (xmltype(:value))",
> >> >>        value = "A very long XML string")
> >> >>
> >> >> Seems very much like a binding issue on the DBI/DBD side.
> >> >>
> >> >> Any thoughts?
> >> >>
> >> >> ~paul
> >> >>
> >> >> This electronic message transmission is a PRIVATE communication
> >> >> which contains information which may be confidential or privileged.
> >> >> The information is intended to be for the use of the individual or
> >> >> entity named above. If you are not the intended recipient, please
> > be
> >> >> aware that any disclosure, copying, distribution or use of the
> >> >> contents of this information is prohibited. Please notify the
> > sender
> >> >> of the delivery error by replying to this message, or notify us by
> >> >> telephone (877-633-2436, ext. 0), and then delete it from your
> >> >> system.
> >>
> >>
> >
> > 
> 

Reply via email to