我正在开发一个带有 oracle OCI 库的 C++ 库。我正在从 Oracle Database 11g 数据库加载。在这里,我需要加载带有小数位的大值。在这种情况下,我需要使用 long double 而不是 double。我不确定 OCI 是否支持 long double。
根据文档 SQLT_FLT 仅适用于 float 和 double 。有人可以让我知道 OCI 是否支持 long double 以及如果支持如何检索它们
问问题
780 次
1 回答
1
是和不是。
根据floats 上的服务器文档,“本机”C 类型最多支持双精度 ( BINARY_DOUBLE
)。但是,NUMBER类型可以存储:
- 1 x 10-130 到 9.99...9 x 10125 范围内的正数,最多 38 个有效数字
- 从 -1 x 10-130 到 9.99...99 x 10125 的负数,最多 38 个有效数字
这比long double
x86/amd64 上的精度更高。
因此,您需要使用该类型而不是BINARY_*
. 可悲的是,开发人员文档说:
您不需要
NUMBER
用作外部数据类型。如果您确实使用它,Oracle 会以其内部 21 字节二进制格式返回数值,并在输入时期望这种格式。以下讨论仅出于完整性考虑。
另一方面,也有关于:
- 使用 OCINumber类型;
- OCI 号码函数。
AFAICS OCINumberFromReal()支持long double
;如果你想要更高的精度,那么你可以使用OCINumberFromText()和十进制字符串。
于 2012-08-28T10:01:25.593 回答