Есть ли на клиенте Oracle 11gR1 или R2 параметр для изменения типа данных, возвращаемых SELECT COUNT (*), с DOUBLE на LONG при вызове API ODBC?

Текущее приложение 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 в моих приложениях.

3

Решение

Агрегатная функция 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 внешние типы данных.

1

Другие решения

Других решений пока нет …