Текущее приложение C ++, использующее вызов API ODBC Oracle Client 10g (все версии), 11gR1 (v11.1.0.6) возвращает LONG (4-байтовое целое) для
SELECT COUNT(*) from tablename
Измените клиент Oracle на 11gR1 (v11.1.0.7) или выше (11.2.x.y и т. Д.), И этот же оператор возвращает DOUBLE (8-байтовое плавающее значение, эквивалентное типу данных Oracle NUMBER).
Поскольку внутренняя БД имеет ту же версию, должна быть настройка на стороне клиента (я полагаю), которая изменила поведение по умолчанию этой функции SQL-агрегата, чтобы она возвращала значение типа double, а не long. Я надеюсь найти такую настройку, которую я могу установить программно через вызов ODBC API или в самой конфигурации Oracle Client.
Я даже пытался использовать SQL CAST
сделать это INT
SELECT CAST(COUNT(*) AS INT) FROM tablename
но это все еще возвращает DOUBLE
(8-байтовое плавающее число).
Примечание: учитывая, что я использую ODBC, я написал много общего кода C ++, поддерживающего возвращаемое значение как LONG, как это было в течение 10 лет через ODBC. Я хотел бы сохранить это, если это возможно, без необходимости написания специального кода ORACLE в моих приложениях.
Агрегатная функция count
вернуть INTEGER
обычно это называют NUMBER(38,0)
,
Все числовые значения в базе данных Oracle хранятся в Oracle NUMBER
формат.
Количество байтов:
круглые ((длина (р) + S) / 2) +1
р = точность;
s = 0 для положительных чисел, 1 для отрицательных чисел;
0 и отрицательная бесконечность потребляют 1 байт, положительная бесконечность — 2 байта;
select round((length(38)+0)/2)+1 from dual; --20 bytes
Попробуйте это (не проверено) ..
select vsize(count(*)) from tablename;
select dump(count(*)) from tablename;
Преобразование / отображение типов данных возможно с помощью OCI внешние типы данных.
Других решений пока нет …