On 16/08/12 16:37, Martin J. Evans wrote:
On 16/08/12 16:13, Charles Jardine wrote:
I thought it might be interesting to see what DBD::Oracle does.
I ran
use strict;
use DBI;
my $dbh =
DBI->connect("dbi:Oracle:", '', '');
my $obj = new Object();
my $sql = q(SELECT ? AS result from dual);
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, $obj);
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
print $row->{'RESULT'}, "\n";
}
package Object;
use overload '""' => 'to_s';
sub new() { bless { }, shift };
sub to_s() { my $self = shift; ref($self); }
and it printed
Object
Because DBD::Oracle does not bind the parameters until execute time
whereas DBD::ODBC binds them at bind_param time. If I change DBD::ODBC
to bind at execute time (there is an internal flag defer_bind which is
no longer used) I get the same result. I'm trying to understand why this
makes a difference here.
The following test re-blesses $obj between the bind and the execute.
It still prints 'Object' even though, at the time of the execute,
$obj is of class Subject. This demonstrates that DBD::Oracle does not
just copy the reference value it has been given. If must do the actual
stringifcation as bind time.
use strict;
use DBI;
my $obj = Object->new;
my $dbh = DBI->connect('dbi:Oracle:', '', '');
my $sth = $dbh->prepare("select ? from dual");
$sth->bind_param(1, $obj);
bless $obj, 'Subject';
$sth->execute;
print scalar $sth->fetchrow_array(), "\n";
package Object;
use overload '""' => 'to_s';
sub new() { bless { }, shift };
sub to_s() { my $self = shift; ref($self); }
package Subject;
use overload '""' => 'to_s';
sub new() { bless { }, shift };
sub to_s() { my $self = shift; ref($self); }
--
Charles Jardine - Computing Service, University of Cambridge
c...@cam.ac.uk Tel: +44 1223 334506, Fax: +44 1223 334679