我使用DBD :: Oracle查询Oracle数据库,但奇怪的是,小数的返回方式如下:
0.1 will be returned as .1
0.97 will be returned as .97
任何想法为什么会这样。
我使用的是最新版本的DBI和DBD :: Oracle。
答案 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没有区别。