Pull to refresh

Comments 9

А если функция должна возвращать разные результаты, даже при разных параметрах, то все будет печально?
Пардон, при одинаковых параметрах
Тогда ее не следует объявлять как DETERMINISTIC, в случае, описанном в посте, ядро Oracle само разберется, что делать.
Подзапросы такого вида (скалярные подзапросы):
SELECT (SELECT get_colour(fruit_name) FROM dual)
FROM fruits;
Кэшируются базой для более быстрого доступа и поэтому не происходит дополнительных вызовов.
В первом случае seq = 16 во во втором 4.
Не знаю есть ли это в документации (не обращал внимания) просто помню с тренинга.
Здесь важен именно подзапрос в SELECT'е
Оракл состоит из «интересных неочевидных особенностей» чуть более, чем наполовину :)

Для полноты картины надо добавить, что объявление функций детерминированными или недетерминированными (и, соответственно, кеширование результатов первых) есть и в других базах. Оптимизатор MySQL с версии 5.1 или даже раньше уже умеет включать кеширование детерминированных функций.
В MSSQL функции тоже можно объявить детерминированными.
Аналогичная особенность есть в PostgreSQL — три типа детерминированности функции: IMMUTABLE, STABLE и VOLATILE.
Подробнее тут: www.postgresql.org/docs/9.0/static/xfunc-volatility.html
Кстати, поищите в документации по Ораклу — может там тоже третий тип найдется? :)
Sign up to leave a comment.

Articles