Ooops...upon reflection, I realize that any parameters
supplied directly in execute()/execute_array() are assumed to have
"default" (eg VARCHAR) type, so a number of my issues below
aren't relevant.

However, IMHO, that still leaves a hole in the 'ArrayTupleFetch => sub { }'
approach if type info is desired, as well as for any alternate rowwise binding...
unless (as previously mentioned) individual "dummy" bind_param()'s
are used to supply type info for each tuple element.

Perhaps just a new binding i/f is needed, eg,

bind_tuple_array([ [ tuple1], [tuple2], ... [tupleN] ], [EMAIL PROTECTED]);

and execute_array() just automagically recognizes that tuples were bound
rowwise ? That may require some add'l DBD driver i/f (as Kristian has
described), but perhaps it simplifies the app level code ?

(Not certain what the behavior is if a misguided app writer
mixes columnwise and rowwise bindings...probably an error ?)

Dean Arnold
Presicient Corp.
www.presicient.com

----- Original Message ----- 
From: "Dean Arnold" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>; "Kristian Nielsen" <[EMAIL PROTECTED]>
Sent: Wednesday, October 08, 2003 1:43 PM
Subject: Re: DBD::Oracle and bulk binds via execute_array


> <snip>
> > 
> > So here is my suggestion, based on my work on the DBD::Oracle
> > execute_array patch:
> > 
> > DBI interface:
> > 
> > The main user-level interface is execute_array(). Four different ways to
> > use:
> > 
> > 1. Column-wise, using $sth->bind_param_array() for each column, then
> >    $sth->execute_array(\%attr). This is the only method that supports
> >    named placeholders (:foo style).
> > 2. Column-wise, using $sth->execute_array(\%attr, [EMAIL PROTECTED], [EMAIL 
> > PROTECTED]).
> 
> m'kay.
> 
> > 3. Row-wise, using execute_array({ArrayTupleFetch => sub { ... } }).
> >    This is the only row-wise method supported in DBI 1.37. This permits
> >    calling execute_array() with a very large number of rows without
> >    having to keep them all in memory at once (subject to driver support;
> >    Oracle will buffer rows and send them off to Oracle in batches
> >    because of OCI restrictions).
> 
> Does this need to be modified to provide the column type info ? I don't see
> anything in the DBI 1.38 POD indicating type info can be specified...tho
> I spose the bind_param() i/f (wo binding data) can be used as a cheat ?
> 
> > 4. Row-wise, using execute_array({ArrayTuple => [ [1,'A'], [2,'B'] ]}).
> >    Useful in the common case where the user already has a list
> >    of tuples. Less memory-efficient than column-wise, though.
> 
> Again, whence column type info ? Also, why less memory efficient 
> (in the wholistic sense) ? If you bind N column arrays of M elements each
> column wise, vs. binding M tuple arrays of N columns for rowwise,
> isn't the total memory use nearly equal ?
> 
> > 
> > DBD::xxx interface:
> > 
> > Low-level methods implemented by drivers and usually only called by the
> > DBI implementation of execute_array():
> > 
> > 1. The execute_for_fetch() method. The implementation of this in the
> >    driver is mandatory (in the sense that without it no native
> >    execute_array() will be available; DBI will emulate it with an
> >    execute() for each row).
> 
> I assume you mean mandatory to support rowwise ?
> 
> > 2. A new $sth->execute_array_rowwise([EMAIL PROTECTED], [EMAIL PROTECTED])
> >    for direct implementation of row-wise array execution. Optional; if
> >    implemented it will be used by DBI::execute_array() when an array of
> >    tuples is already available (ie. execute_array() method 4 above).
> 
> - needs type attribute capability; maybe also a named PH order list to indicate
> which tuple elements map to which named PHs ?
> 
> - should argument order be changed to more closely match execute_array ?
> 
> > 3. A new $sth->execute_array_colwise([EMAIL PROTECTED], [EMAIL PROTECTED], ..., 
> > [EMAIL PROTECTED])
> >    for direct implementation of column-wise array execution. Optional;
> >    if implemented it will be used by DBI for execute_array() method 1
> >    and 2 above. If we want to implement named placeholders this method
> >    needs to be extended to take a mapping { 'foo' => [EMAIL PROTECTED],
> >    'bar' => [EMAIL PROTECTED] }, but maybe that is not so important.
> > 
> > 
> >  - Kristian.
> > 
> > -- 
> > Kristian Nielsen   [EMAIL PROTECTED]
> > Development Manager, Sifira A/S
> > 
> 
> Dean Arnold
> Presicient Corp.
> www.presicient.com
> 

Reply via email to