3

当前使用 ODBC API 调用Oracle Client 10g (所有版本)、11gR1 (v11.1.0.6) 的C++ 应用程序返回一个 LONG(4 字节整数) SELECT COUNT(*) from tablename

将 Oracle 客户端更改为 11gR1 (v11.1.0.7) 或更高版本(11.2.xy 等),并且同一语句返回 DOUBLE(相当于 oracle NUMBER 数据类型的 8 字节浮点值)。

由于后端数据库是相同的版本,因此必须有一个客户端设置(我推测)已更改此聚合 SQL 函数的默认行为以返回双精度而不是长整数。我希望找到这样的设置,我既可以通过 ODBC API 调用以编程方式设置,也可以在 Oracle 客户端配置本身中进行设置。

我什至尝试使用SQL CAST使其成为一个,INT SELECT CAST(COUNT(*) AS INT) FROM tablename 但仍然返回一个DOUBLE(8 字节浮点数)。

注意:鉴于我使用 ODBC,我已经编写了许多通用 C++ 代码,支持将返回值设为 LONG,因为 10 年来通过 ODBC 一直如此。如果可能的话,我想保持这一点,而不必在我的应用程序中编写 ORACLE 特定代码。

4

1 回答 1

1

聚合函数count返回一个INTEGER,它通常被称为NUMBER(38,0)。Oracle 数据库中的所有数值都以 OracleNUMBER格式存储。

字节数:

圆形((长度(p)+s)/2)+1

p = 精度;
s = 0 表示正数,1 表示负数;
0和负无穷大消耗1个字节,正无穷大消耗2个字节;

select round((length(38)+0)/2)+1 from dual; --20 bytes

试试这个(未测试)..

select vsize(count(*)) from tablename;
select dump(count(*)) from tablename;

OCI外部数据类型可以进行数据类型转换/映射。

于 2012-11-11T02:45:21.370 回答