DBD :: Oracle Column以异常格式返回数字

时间:2012-12-06 12:53:48

标签: oracle perl numbers dbi

我使用DBD :: Oracle查询Oracle数据库,但奇怪的是,小数的返回方式如下:

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

任何想法为什么会这样。

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

1 个答案:

答案 0 :(得分: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

我添加Devel :: Peek只是为了向你展示它们是字符串(参见PV),所以添加TO_CHAR没有区别。