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

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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=16653