(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Oracle: Сравнение явного и неявного преобразования

Источник: sqlbooks

(оригинал: Mini-Tip #10 - Implicit vs. Explicit Conversion)
Перевод Моисеенко С.И.

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

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

Под преобразованием я понимаю приведение хранимых данных из одного типа к другому типу данных. Например, символьное поле "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. Использование явных преобразований следует отнести к лучшим методам для любой базы данных и любого языка программирования.

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

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 26.06.2008 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Standard Edition 2 Named User Plus License
Oracle Database Standard Edition 2 Processor License
Oracle Database Personal Edition Named User Plus Software Update License & Support
Oracle Database Personal Edition Named User Plus License
IBM Rational Functional Tester Floating User License
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
СУБД Oracle "с нуля"
Новые программы для Windows
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100