【问题标题】:How to fetch oracle type NUMBER as string or int/uint?如何获取 oracle 类型 NUMBER 作为字符串或 int/uint?
【发布时间】:2020-07-09 06:38:26
【问题描述】:

我正在使用 C++ 中的 ODPI-C 从 oracle 数据库中获取一行,而 NUMBER(19,0) 类型似乎是双倍的,因此在某些情况下,字段值已损坏(例如,在 db viewer 中显示 5187413295700 304461 但是在 fetch 之后它变成了 5.1874132957002998e+18 这不太正确)。

读取字段值由

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

其中返回参数dpiNativeTypeNum nativeTypeNum设置为DPI_ORACLE_TYPE_NUMBER

dpiQueryInfo info的返回参数

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

function 表示该字段应该被读取为Double。

更新

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

还有一个类 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 函数呢?

【问题讨论】:

标签: c oracle oracle-call-interface odpi-c


【解决方案1】:

可以使用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获取数据,并读取为字节。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2010-10-24
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-26
    • 1970-01-01
    相关资源
    最近更新 更多