ENG GER GER pl
PCproxy mail RSS




Регистрация | Вход

Меню сайта

Форма входа

Последние новости

Наши друзья

Наш опрос
Вы часто бываете на ITsecure.org.ua?
Всего ответов: 453

Наши друзья



Главная » Статьи » СУБД » Oracle |

Статьи, посвященные СУБД Caché DB2 FoxPro
Informix InterBase/Firebird Microsoft SQL Server MySQL
Oracle Postgres (PostgreSQL) Sybase ЛИНТЕР
MS Access



Сравнение явного и неявного преобразования типа
Начну с того, что я полагаю, что неявное преобразование - это плохо. Еще хуже. Зло. Нет-нет, серьезно! Теперь позвольте мне дать определения преобразований обоих типов и объяснять, почему я так считаю.

Преобразование

Под преобразованием я понимаю приведение хранимых данных из одного типа к другому типу данных. Например, символьное поле "1" может быть преобразовано к числовому 1. Символьное поле может быть преобразовано к полю даты, если оно правильно отформатировано. Форматирование преобразования может управляться командой и маской формата (явное преобразование), или Вы можете положиться на Oracle и/или инструмент третьих фирм, который сделал бы это за Вас (неявное преобразование).

Неявное преобразование

Примером неявного преобразования может быть:

SELECT *
FROM emp
WHERE hiredate between '01-JAN-1981' and '01-APR-1981';

Если Вы используете схему scott и оригинальную таблицу emp, то должны получить две строки. Возможно. Если Вы используете sql*plus или другой инструмент, который не устанавливает маску формата даты по умолчанию, и окажется, что маска формата базы данных по умолчанию совпадает с той, что я ввел, или Вы используете инструмент, который установил маску формата в соответствии с той, что я ввел.

Явное преобразование

SELECT *
FROM emp
WHERE hiredate between TO_DATE('01-JAN-1981', 'DD-MON-YYYY')
and TO_DATE('01-APR-1981', 'DD-MON-YYYY');

Если Вы выполните этот оператор, то должны получить две строки, независимо от того, какой инструмент или какие маски формата по умолчанию установлены.

Отметьте, что различие состоит в том, что я ЯВНО выполнил преобразование из символьного представления к дате с помощью функции TO_DATE, в которой я указал правильную маску формата.

Явное преобразование требует дополнительного набора. Это верно.

Так что использовать?

Всегда, всегда, всегда используйте явное преобразование. Помимо того, что это намного проще читать и поддерживать, явное преобразование гарантирует, что, если формат по умолчанию когда-нибудь будет изменен, ваш код продолжит работать.

Вы не поверите, сколько мне встречалось проблем с производственными системами, вызванных лишь тем, что кто-то поигрался с параметрами nls в базе данных.

Всегда, всегда, всегда используйте явное преобразование.

Что говорит Oracle?

Это выдержка непосредственно из справочного руководства к Oracle 10g:

Преобразование данных

Как правило, выражение не может содержать значения данных разных типов. Например, выражение не может перемножить 5 и 10, а затем добавить 'JAMES'. Однако Oracle поддерживает как неявное, так и явное преобразование значений из одного типа данных в другой.

Неявное и явное преобразование данных

Oracle рекомендует, чтобы Вы задавали явные преобразования, вместо того, чтобы полагаться на неявные или автоматические преобразования, по следующим причинам:

? Операторы SQL легче понять, когда Вы используете функции явного преобразования типа данных.

? Неявное преобразование типа данных может оказать отрицательное влияние на производительность, особенно если тип данных столбца преобразуется к типу данных константы, а не наоборот.

? Неявное преобразование зависит от контекста, в котором оно происходит и, возможно, не будет работать одинаково в каждом случае. Например, неявное преобразование значения типа данных VARCHAR2 может возвратить неожиданный год в зависимости от значения параметра NLS_DATE_FORMAT.

? Алгоритмы для неявного преобразования подвержены изменениям при обновлении версий продуктов Oracle. Поведение явных преобразований более предсказуемо.

Я полагаю, что эти аргументы применимы не только к Oracle. Использование явных преобразований следует отнести к лучшим методам для любой базы данных и любого языка программирования.

Если Вы обнаружите случай, когда неявное преобразование окажется лучше, чем явное, пожалуйста, напишите комментарий к этому посту и объясните. Мне ничего подобное не приходит в голову.

Категория: Oracle | Добавил: admin (13.04.2009)
Просмотров: 2595 | Комментарии: 1 | Рейтинг: 0.0/0 |
Всего комментариев: 1
08.10.2012
1. Satchell [Материал]
If time is money you've made me a welateihr woman.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Реклама на сайте

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Наши друзья

Счетчики
  • Каталог Луганских сайтов
  • МЕТА - Украина. Рейтинг сайтов
  • Rambler's Top100
Ваш IP: 216.73.216.210

При полном или частичном копировании материалов с сайта, ссылка на ITsecure.org.ua обязательна!
ITsecure.org.ua ©2008-2026