On Wed, 31 Dec 2014 16:58:02 +0100, "H.Merijn Brand"
<h.m.br...@xs4all.nl> wrote:

> I have something weird in DBD::Oracle (1.44 and 1.74)
> Client = 10.2.0.1.0 / AIX-5.3 - Server = 11.2.0.3.0 - 64bit / Linux
> 
> consider a field that looks like this:
> 
> {   LINK             => undef,
>     NAME             => 'D_GELD',
>     NAME_lc          => 'd_geld',
>     NAME_uc          => 'D_GELD',
>     NULLABLE         => '',
>     PRECISION        => 8,
>     SCALE            => 0,
>     TYPE             => 3,
>     TYPE_NAME        => 'DECIMAL',
>     dbd_type         => undef,
>     ora_est_row_width => undef,
>     ora_fail_over    => undef,
>     ora_lengths      => 172,
>     ora_rowid        => undef,
>     ora_type         => undef,
>     ora_types        => 2
>     }
> 
> *sometimes* I get 126 in the PRECISION entry instead of 8
> does that ring any bells?
> 
> I get 126 only if I use a where clause that addresses a field that is
> first in an index on that table otherwise I get 8

I can reproduce it with this:

--8<--- test.pl
use 5.16.2;
use warnings;

use DBI;

my $dbh = DBI->connect ("dbi:Oracle:", $ENV{DBI_USER}, $ENV{DBI_PASS}, {
    RaiseError         => 1,
    PrintError         => 1,
    AutoCommit         => 1,
    ChopBlanks         => 1,
    ShowErrorStatement => 1,
    FetchHashKeyName   => "NAME_lc",
    });

say "DBI: $DBI::VERSION";
say "DBD: $DBD::Oracle::VERSION";
say "OCI: ", ORA_OCI;
say "Svr: @{$dbh->func ('ora_server_version')}";

$dbh->do (qq;
    create table foo (
        a1       number (3) default -1,
        a2       number (4) default -1,
        a3       number (3) default -1,
        d_foo    number (8) default -1,
        v_foo    number (2) default  0,
        hist     char   (1) default 'A'
        ););

sub prec
{
    my $sth = $dbh->prepare (shift);
    $sth->execute;
    printf "PRECISION: %3d, St: %s\n", $sth->{PRECISION}[3], $sth->{Statement};
    } # prec

sub test
{
    prec ("select a1, a2, a3, d_foo, v_foo from foo");
    prec ("select a1, a2, a3, d_foo, v_foo from foo where a1 = 111");
    prec ("select a1, a2, a3, d_foo, v_foo from foo where a2 = 111");
    prec ("select a1, a2, a3, d_foo, v_foo from foo where d_foo = 111");
    } # test

test ();

$dbh->do ("insert into foo values (101, 101, 25, 19841213, 0, 'A')");

test ();

$dbh->do ("create index idx_foo on foo (a1, a2, a3, d_foo desc, v_foo desc, 
hist)");

test ();

END { $dbh->do ("drop table foo"); }
-->8---

$ perl test.pl
DBI: 1.632
DBD: 1.74
OCI: 11.2.0.3
Svr: 11 2 0 3 0
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where a1 = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where a2 = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where d_foo = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where a1 = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where a2 = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo where d_foo = 111
PRECISION:   8, St: select a1, a2, a3, d_foo, v_foo from foo
PRECISION: 126, St: select a1, a2, a3, d_foo, v_foo from foo where a1 = 111
PRECISION: 126, St: select a1, a2, a3, d_foo, v_foo from foo where a2 = 111
PRECISION: 126, St: select a1, a2, a3, d_foo, v_foo from foo where d_foo = 111


SQL*Plus: Release 11.2.0.3.0 Production on Wed Dec 31 18:42:36 2014
This is perl 5, version 20, subversion 0 (v5.20.0) built for 
x86_64-linux-thread-multi-ld

-- 
H.Merijn Brand  http://tux.nl   Perl Monger  http://amsterdam.pm.org/
using perl5.00307 .. 5.21   porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/        http://www.test-smoke.org/
http://qa.perl.org   http://www.goldmark.org/jeff/stupid-disclaimers/

Attachment: pgp6dS65H8sK6.pgp
Description: OpenPGP digital signature

Reply via email to