Как получить oracle типа ЧИСЛО в виде строки или int / uint? - PullRequest
0 голосов
/ 09 июля 2020

Я беру строку из базы данных 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?

1 Ответ

0 голосов
/ 09 июля 2020

Строки можно получить, используя dpiVar* s. Просто перед dpiStmt_fetch я определил dpi_Var * с помощью этого вызова

dpiStmt_defineValue(statement, 1, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_BYTES, 0, 0, nullptr)

Вы можете заметить, что в этом вызове oracle type установлен на DPI_ORACLE_TYPE_NUMBER, но собственный тип установлен на DPI_NATIVE_TYPE_BYTES.

После выборки данные собираются с использованием dpiStmt_getQueryValue и читаются как байты.

...