DBD::Oracle を使用して Oracle データベースにクエリを実行していますが、奇妙なことに、小数点以下が次のように返されます。
0.1 will be returned as .1
0.97 will be returned as .97
なぜこれが起こっているのかについてのアイデア。
DBI と DBD::Oracle の最新バージョンを使用しています。
これが、セッションのデフォルトの数値形式になります。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 を追加しても違いはありません。