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