Все о разработке в СУБД "Oracle" SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое.
create or replace function sleep(p_sec number) return number is begin dbms_session.sleep(p_sec); -- 18+ -- dbms_lock.sleep(p_sec); -- до 18 return 1; end; /Выполняется такой запрос:
select nvl(sleep(5), sleep(10)) from dual;За сколько секунд он выполнится? Рекомендую не повторять этот код, а подумать и выбрать ответ. И только после этого, повторить в СУБД и проверить себя. #задача
declare
my_var integer;
begin
select nvl(c.a, c.b) into my_var from my_table c; -- Вызов SQL-функции
my_var := nvl(my_var, 0); -- Вызов PL/SQL-функции
end;
/Зачем нам нужно помнить о разных функциях? Причин несколько: 1️⃣ В PL/SQL может не оказаться соответствующей функции из SQL. Например, вы не сможете в PL/SQL-коде напрямую вызвать SQL-функции NVL2 и DECODE. Видимо, разработчики не стали включать в состав языка эти функции посчитав достаточно универсальной конструкцию CASE. Наличие интересующей функции можно проверить в пакете SYS.STANDARD. Также можно обратиться к документации на язык PL/SQL и проверить вызов на практике в обычном анонимном PL/SQL-блоке. 2️⃣ В SQL может не оказаться "своей" вызываемой функции. В таком случае можно попробовать обратиться к PL/SQL-функции напрямую через пакет SYS.STANDARD. Например:
select sys.standard.sqlcode from dualВ таком случае произойдёт то самое переключение контекста. Но не всякая PL/SQL-функция доступна в SQL из-за различий в поддерживаемых типах данных (Движок SQL ничего не знает о типе BOOLEAN). 3️⃣ Одноимённые реализации функции в SQL и PL/SQL-движках могут выдавать разные результаты. К сожалению, такое иногда встречается, поскольку каждую из реализаций внутри Oracle Database писали и поддерживали разные люди. Я натыкался на различия в результатах для функции
TO_CHAR(left number, format varchar2, parms varchar2). Функции применяли разное выравнивание пробелами и приходилось прилагать дополнительные усилия, чтобы преобразование везде работало одинаково.
✅Пожалуйста, напишите в комментариях, встречалось ли вам что-то подобное.
Автор: @alexeionin
#функцииselect some_col1 from tab1 union select some_col1 from tab2;Давайте подумаем, а в чем различие операций на уровне выполнения. За счет чего достигается уникальность отдаваемых значений в UNION? За счет дополнительного шага сортировки. И это прекрасно видно в плане запроса. После шага UNION-ALL выполняется SORT. Я всегда говорю, если вам сортировка не требуется, то не надо её делать. Избавляемся от лишних сортировок. ⚠️ Возьмите за правило, использовать по умолчанию операцию UNION ALL, которая не выполняет сортировку. Только, если по бизнес-процессу требуется уникальность значений используйте UNION. Помогите СУБД избавиться от лишней работы 😉 #оптимизация #union #unionall