Тип данных FLOAT
не является полной картиной. Разработчик SQL не показывает, что NFLOAT
имеет точность менее 50, в то время как NREAL
и NFLOAT1
имеют точность 50 или выше. При создании не указывается точность по умолчанию 126, что составляет максимально возможная точность для типа данных FLOAT .
Простой тестовый запрос продемонстрирует разницу:
SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL
Первый столбец будет возвращен как System.Double
. Второй будет возвращен как System.Decimal
.
В SQL Developer щелкните правой кнопкой мыши таблицу и выберите «Редактировать ...». В этом диалоговом окне показывает заданную точность для столбца.
Если вы хотите, чтобы NFLOAT
было возвращено как System.Decimal
, увеличьте точность как минимум до 50.
В последнее время я прочесываю документацию и запускаю собственные тесты. Это любимый проект, и я не пользуюсь Oracle регулярно, поэтому было много проб и ошибок.
Функция DUMP
очень помогла определить, правильно ли указан тип данных в выражении, прежде чем посмотреть, что с ним делает ODP .NET.
В качестве другого примера того, как ODP .NET возвращает разные типы данных в зависимости от точности, рассмотрим NUMBER(p,0)
.
Type Min p Max p
---------------------------
Int16 1 4
Int32 5 9
Int64 10 18
Decimal 19 38
Я надеялся, что Byte
или SByte
будут возвращены, когда p
равно 1 или 2, но это не сработало.