c++ - Oracle 11gR1 或 R2 客户端上是否有设置可在 ODBC API 调用中将 SELECT COUNT(*) 返回的数据类型从 DOUBLE 更改为 LONG?

标签 c++ oracle count odbc

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

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

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

我什至尝试使用 SQL CAST 使其成为 INT 从表名中选择 CAST(COUNT(*) AS INT) 但它仍然返回一个 DOUBLE(8 字节 float )。

注意:考虑到我使用 ODBC,我编写了很多通用的 C++ 代码来支持 LONG 的返回值,这就是 ODBC 10 年来的做法。如果可能的话,我想保持这种状态,而不必在我的应用程序中编写特定于 ORACLE 的代码。

最佳答案

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

Number of Bytes:

round((length(p)+s)/2)+1

p = precision;
s = 0 for positive numbers, 1 for negative numbers;
0 and negative infinity consume 1 byte, positive infinity consumes 2 bytes;

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

试试这个(未测试)..

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

OCI 可以进行数据类型转换/映射 external data types .

关于c++ - Oracle 11gR1 或 R2 客户端上是否有设置可在 ODBC API 调用中将 SELECT COUNT(*) 返回的数据类型从 DOUBLE 更改为 LONG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285091/

相关文章:

laravel - 错误 ORA-12505 : TNS:listener does not currently know of SID given in connect descriptor Laravel 5. 8 Yajra

mysql - 使用多个 LEFT JOIN 时,COUNT 和 SUM 会相乘

python - pandas 计算列中相同元素的数量,如果数量很小则删除

c++ - 从使用 emscripten 编译的 C++ 连接 websocket 时出现问题

c++ - 什么时候通过引用在另一个 lambda 中捕获一个 lambda 是安全的?

MySQL数据字段转oracle

oracle - 如果列不存在则更改表

java - 如何使用java和hibernate在mysql中按组计算行数?

c++ - 为什么不能将 C++ 设置迭代器强制转换为 boolean 值?

c++ - 为什么 C++ 被视为静态语言