如何获取 oracle 类型 NUMBER 作为字符串或 int/uint?

How to fetch oracle type NUMBER as string or int/uint?

我在 C++ 中使用 ODPI-C 从 oracle 数据库中获取一行,NUMBER(19,0) 类型似乎是双精度的,因此在某些情况下字段值已损坏(例如在数据库查看器中显示 5187413295700304461 但在获取后它被转换为 5.1874132957002998e+18 这不太正确)。

读取字段值由

完成
int dpiStmt_getQueryValue(dpiStmt *stmt, uint32_t pos, dpiNativeTypeNum *nativeTypeNum, dpiData **data);

其中return参数dpiNativeTypeNum nativeTypeNum设置为DPI_ORACLE_TYPE_NUMBER

return参数dpiQueryInfo信息

int dpiStmt_getQueryInfo(dpiStmt *stmt, uint32_t pos, dpiQueryInfo *info);

function 指示该字段应读取为 Double。

更新

我不确定,但在 OCI(其包装器是 ODPI-C)中有一个函数叫做 OCINumberToText。我想我需要的就是这种功能。

还有一个 class ResultSet,它有一个名为 getString(unsigned int colIndex) 的成员函数,它完全满足我的需要(将 NUMBER(19,0) 转换为 std::string)。

更新 2

我找到了一个名为 dpiDataTypeInfo.ociTypeCode 的成员字段,其注释为“指定数据的 OCI 类型代码,如果该类型不受 ODPI-C 支持,这将很有用” 从这里 https://oracle.github.io/odpi/doc/structs/dpiDataTypeInfo.html#dpidatatypeinfo

但是如何使用它来调用 OCI 函数?

可以使用 dpiVar*s 获取行。就在 dpiStmt_fetch 之前,我使用此调用

定义了 dpi_Var*
dpiStmt_defineValue(statement, 1, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_BYTES, 0, 0, nullptr)

您可以注意到,在该调用中,oracle 类型设置为 DPI_ORACLE_TYPE_NUMBER,但本机类型设置为 DPI_NATIVE_TYPE_BYTES。

获取数据后使用dpiStmt_getQueryValue获取数据,并读取asBytes。