如何获取 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。
我在 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
之前,我使用此调用
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。