Я беру строку из базы данных oracle, используя ODPI- C в C ++, и тип NUMBER (19,0) кажется двойным, поэтому в некоторых случаях значение поля оказывается поврежденным (например, в программе просмотра db отображается 5187413295700 304461 , но после выборки он преобразуется в 5.187413295700 2998 e + 18, что не совсем правильно).
Чтение значения поля выполняется
int dpiStmt_getQueryValue(dpiStmt *stmt, uint32_t pos, dpiNativeTypeNum *nativeTypeNum, dpiData **data);
, который возвращает параметр dpiNativeTypeNum nativeTypeNum установлен на DPI_ORACLE_TYPE_NUMBER
Возвращаемый параметр информация dpiQueryInfo из
int dpiStmt_getQueryInfo(dpiStmt *stmt, uint32_t pos, dpiQueryInfo *info);
* Функция 1020 * указывает, что поле должно читаться как Double.
UPDATE
Я не уверен, но в OCI (из которых оболочка ODPI- C) есть это функция с именем OCINumberToText
. Я полагаю, что такая функция - это то, что мне нужно.
Также есть класс ResultSet, который имеет функцию-член getString(unsigned int colIndex)
, которая делает именно то, что мне нужно (преобразует NUMBER (19,0) в std :: string).
UPDATE 2
Я обнаружил поле члена с именем dpiDataTypeInfo.ociTypeCode с комментарием «Указывает код типа OCI для данных, который может быть полезен, если тип не поддерживается ODPI- C "отсюда https://oracle.github.io/odpi/doc/structs/dpiDataTypeInfo.html#dpidatatypeinfo
, но как использовать это для вызова функций OCI?