2012-12-06 67 views
1

我查询使用DBD ::甲骨文Oracle数据库的数量,然而,奇怪的是十进制的回报如下:DBD :: Oracle列返回不寻常的格式

0.1 will be returned as .1 
0.97 will be returned as .97 

任何想法,为什么发生这种情况。

我正在使用最新版本的DBI和DBD :: Oracle。

回答

1

这将是会话中的默认数字格式。 DBD :: Oracle将字段作为字符串检索,因此Oracle会完成隐式的TO_CHAR。如果你想要一个不同的格式做一个TO_CHAR(column_name,'FORMAT')。例如,

use strict; 
use warnings; 
use DBI; 
use Devel::Peek; 

my $h = DBI->connect('dbi:Oracle:host=xxx;sid=xxx','xxx','xxx', 
        {RaiseError => 1}); 
eval { 
    $h->do(q/drop table mje/); 
}; 

$h->do(q/create table mje (a number)/); 
my @n = (0.1, 0.97); 

my $s = $h->prepare(q/insert into mje values(?)/); 


foreach (@n) { 
    $s->execute($_); 
} 

$s = $h->prepare(q/select * from mje/); 
$s->execute; 
while (my @row = $s->fetchrow) { 
    Dump($row[0]); 
} 


$s = $h->prepare(q/select TO_CHAR(a, '09D99') from mje/); 
$s->execute; 
while (my @row = $s->fetchrow) { 
    Dump($row[0]); 
} 

输出

SV = PV(0x9b72810) at 0x9c57ed8 
    REFCNT = 1 
    FLAGS = (POK,pPOK) 
    PV = 0x9d11ec0 ".1"\0 
    CUR = 2 
    LEN = 12 
SV = PV(0x9b72810) at 0x9c57ed8 
    REFCNT = 1 
    FLAGS = (POK,pPOK) 
    PV = 0x9d18230 ".97"\0 
    CUR = 3 
    LEN = 12 
SV = PV(0x9b72840) at 0x9c57ff8 
    REFCNT = 1 
    FLAGS = (POK,pPOK) 
    PV = 0x9d0d600 " 00.10"\0 
    CUR = 6 
    LEN = 12 
SV = PV(0x9b72840) at 0x9c57ff8 
    REFCNT = 1 
    FLAGS = (POK,pPOK) 
    PV = 0x9d0d600 " 00.97"\0 
    CUR = 6 
    LEN = 12 

我加入了杰韦利::皮克只是告诉你,他们都是字符串(参见PV)时默认添加TO_CHAR没什么区别。

+0

谢谢你的解释。我会试试这个。 – HMadhi