1

我正在使用 DBD::Oracle 查询 Oracle 数据库,然而,奇怪的是,小数返回如下:

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

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

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

4

1 回答 1

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 没有区别。

于 2012-12-06T13:36:07.287 回答