Ran into that one, or nearly like it, a while back.  Was not able to find a 
OCI/DBD solution so I just modified my code like this
 
$sth->execute_array({},\ @undefs, \@undefs, \@data_ids, \@set_ids, $ct_none);

 so I had an array for each param
 
a quick kludge only.
 
If I get a little time this week I will try to look into it.
 
Cheers
John
 

> Date: Tue, 20 Mar 2012 13:12:56 +0100
> From: h...@wsr.ac.at
> To: dbi-users@perl.org
> Subject: [DBD::Oracle] ORA-02005 on array insert
> 
> A few months ago we upgraded two of our servers from RHEL 4 to RHEL6.
> Unfortunately the upgrade involved the OS, the Perl version (5.8.8 ->
> 5.10.1), the Oracle client version (still 10g, but now instant client)
> and DBD::Oracle (1.19 -> 1.30 (now 1.38)), and we didn't note the
> problem at once, so it's unclear which of the many changes is the
> culprit, but I suspect it's a bug in DBD::Oracle.
> 
> Anyway, since the upgrade sometimes (not always) array inserts returned
> the error 
> 
> DBD::Oracle::st execute_array failed: ORA-02005: implicit (-1)
> length not valid for this bind or define datatype (DBD ERROR:
> OCIBindByName) 
> 
> Here is a test script which semi-reliably (>= 50% of the time) produces
> the error message:
> 
> 
> #!/usr/bin/perl
> 
> use warnings;
> use strict;
> 
> use DBI;
> 
> my $dbi_credential_file = $ARGV[0];
> my ($data_source, $username, $auth) = read_cred($dbi_credential_file);
> 
> my $conn_attr = {
> AutoCommit => 0,
> PrintError => 0,
> RaiseError => 1
> };
> $ENV{NLS_LANG} = '.AL32UTF8'; # real UTF-8
> my $dbh = DBI->connect($data_source, $username, $auth, $conn_attr);
> $dbh->{FetchHashKeyName} = 'NAME_lc';
> 
> $dbh->do("create table bug_ora_02005_$$ (
> set_id number not null,
> data_id number not null,
> time number,
> period_start number,
> period_end number,
> real number,
> string number,
> coordtype number,
> 
> constraint bug_ora_02005_${$}_pk primary key(data_id, set_id)
> )
> ");
> 
> my $n = 900;
> my $ct_none = undef;
> 
> for my $run (1 .. 1_000) {
> print STDERR "run: $run\n";
> my $data_ids;
> my @set_ids;
> for (1 .. $n) {
> push @$data_ids, $_;
> push @set_ids, $run;
> }
> my $sth = $dbh->prepare_cached("insert into bug_ora_02005_$$(period_start, 
> period_end, data_id, set_id, coordtype)
> values(?, ?, ?, ?, ? )");
> 
> $sth->execute_array({}, undef, undef, $data_ids, \@set_ids, $ct_none);
> }
> $dbh->commit();
> 
> $dbh->do("drop table bug_ora_02005_$$");
> $dbh->disconnect();
> 
> sub read_cred {
> my ($fn) = @_;
> 
> open(my $fh, "<$fn") or die "cannot open $fn: $!";
> my $line = <$fh>;
> my @cred = split(/[\s\n]+/, $line);
> return @cred;
> }
> __END__
> 
> Some notes:
> 
> ARGV[0] is supposed to be the name of a file containing space-separated
> connect data, e.g.:
> dbi:Oracle:ORCL scott tiger
> 
> When the script fails, it always fails on the second iteration of the
> loop. If it gets through the second iteration it completes all 1000
> iterations successfully.
> 
> When the call to prepare_cached is replaced by a simple prepare, the
> script fails less often. 
> 
> I have run the script with DBI_TRACE=4, but I don't see any significant
> difference between successful and unsuccessful runs.
> 
> hp
> 
> -- 
> _ | Peter J. Holzer | Auf jedem Computer sollte der Satz Ludwigs II
> |_|_) | Sysadmin WSR | eingeprägt stehen: "Ein ewig Rätsel will ich
> | | | h...@wsr.ac.at | bleiben, mir und andern."
> __/ | http://www.hjp.at/ | -- Wolfram Heinrich in desd
                                          

Reply via email to