On Mon, Jun 16, 2003 at 04:36:36PM +0200, Kristian Nielsen wrote:
> Tim Bunce <[EMAIL PROTECTED]> writes:
>
> > sub execute_for_fetch {
> > my ($fetch_tuple_sub, $tuple_status) = @_;
> > while (1) {
> > my @tuple_batch;
> > for (my $batch_size = 10000; $batch_size-- > 0; ) {
> > push @tuple_batch, $fetch_tuple_sub->() || last;
> > }
> > last unless @tuple_batch;
> > $sth->ora_execute_array([EMAIL PROTECTED], \my @tuple_batch_status);
> > push @$tuple_status, @tuple_batch_status;
> > }
> > }
>
> Maybe that should be
>
> push @tuple_batch, [ @{$fetch_tuple_sub->() || last} ];
>
> in case $fetch_tuple_sub wants to return the same reference every time
> (or document that it should not do that).
Good point.
> > Taking a step back for a moment... The switch from column-wise
> > arrays in execute_array() to row-wise arrays in ora_execute_array()
> > is interesting.
> >
> > Perhaps there's scope for the DBI to add a new execute_* method to
> > do what ora_execute_array is doing here. Take a simple set of tuples
> > (as array of tuple arrays) plus a status array.
> >
> > Then I could change the default execute_for_fetch method in the DBI
> > to call that one. Driver authors would then have more options in
> > what they override.
>
> I was wondering... how will ora_execute_array() work with bind
> attributes (ie. TYPE => xxx, ora_type => xxx, ...)?
>
> Will there be calls to bind_param() with dummy values, like
>
> $sth->bind_param(1, undef, { ora_type => 97 });
> $sth->ora_execute_array([ ['a'], ['b'], ['c'] ], \ my @statuses);
>
> with the OCIBindDynamic callback somehow accessing the type information?
No changes should be needed. The "dummy call to bind_param" is the way
it's supposed to work for apps that need to set TYPE etc. The bind_param
info is defined to be 'sticky'.
> I haven't yet the overview of the whole bind/execute implementation in
> DBD::Oracle to have a firm opinion on this issues yet, really. It seems
> that for ora_execute_array(), the logic in bind_param() must be split,
> with the type-related part (OCIBindByName(), ...) going in
> ora_execute_array(), and the value-related part (SV conversions ...) in
> the OCIBindDynamic callback.
Sound about right.
> In terms of bind semantics, column-wise (using bind_param_array() and
> execute_array()) seems kind of simpler than row-wise, because of the
> explicit bind.
I'm not sure what you're saying there.
Tim.
> Any thoughts?
>
> - Kristian.
>
> --
> Kristian Nielsen [EMAIL PROTECTED]
> Development Manager, Sifira A/S
>