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 に答える