Отличные видео уроки. Работаю с Oracle более 20 лет и, не смотря на это, получаю удовольствие от просмотра. Отличная структура лекции, понятные примеры, грамотная профессиональная речь. Спасибо за труд.
Если упразднить автономную транзакцию в функции-обертке, обращающейся к sysdate, то результат все равно станет зависим от времени. Так как применение plsql-ных функций (а не функций самого языка вроде sysdate) в SQL-запросе чревато получением "новых данных" в процессе исполнения. Мне это говорили знающие люди, но Ваши примеры натолкнули меня на мысль это проверить. Так что спасибо большое за примеры.
Привет. Есть ли возможность создавать функции, которые возвращают разные по типу таблиц данные? Простой пример: входящяя текстовая переменная функции принимает разные Sql запросы, внутри тела функции выполняется и выводит результат. Так как запросы разные, то и тип результата отличается.
Не используем конвейерные функции, так как не используем коллекции. А коллекции не используем так как на промышленных объемах (от 100 миллионов/миллиардов строк) быстро переполняется PGA при использовании коллекций в пакетных обработках. Лучшее решение..это избавиться от коллекций и использовать обычные таблицы или временные))) Работает все намного быстрее плюс параллельность высокая. Я рекомендую автору провести аналогичные тесты ..используя обычные таблицы и полноценные объемы данных...
Спасибо за комментарий. Именно поэтому я не рекомендую использовать коллекции на больших объемах данных. Автор всё это уже давно исследовал. Тем не менее, это никак не мешает освещению конвейерных функций.
В сложных запросах, которые выгребают много данных используем динамически собираемый select И возвращаем из процедуры в сисрефкурсор Есть вопрос по поводу конвеерных функций. Если мы хотим коллекцию использовать в запросе, то не лучше ли избегать табличных функций и конвеерных в частности в пользу вьюх? Вообще если мы можем SQL-ем обойтись, то нужны ли функции?
Спасибо, что поделились. По поводу вопроса. Зависит от ситуации. Например, вы хотите дать API, которое бы на вход принимало и выполняло строго определенные запросы (с хинтами), например. Можно даже кастомно логировать, кто запрашивал данные, не настраивая FGA. Почему нет. Наверняка, можно придумать еще кейсы, где бы табличные функции были более предпочтительней. В большинстве случаю - view подойдут.
Николай, спасибо! Удивительно как я пропустил... поправил в репозитории. В видео уже, к сожалению, не исправить. Цифры плюс минус те же получились. Итоговый вариант: create or replace function get_session_pga return number as v_pga_size number; begin select sum(round(s.value / 1024)) into v_pga_size from sys.v$sesstat s ,sys.v$statname n where s.statistic# = n.statistic# and sid = sys_context('USERENV', 'SID') and lower(n.name) = 'session pga memory'; return v_pga_size; end; /
Отличные видео уроки. Работаю с Oracle более 20 лет и, не смотря на это, получаю удовольствие от просмотра.
Отличная структура лекции, понятные примеры, грамотная профессиональная речь.
Спасибо за труд.
рад читать такой фидбек от ветеранов ;-)
Если упразднить автономную транзакцию в функции-обертке, обращающейся к sysdate, то результат все равно станет зависим от времени. Так как применение plsql-ных функций (а не функций самого языка вроде sysdate) в SQL-запросе чревато получением "новых данных" в процессе исполнения. Мне это говорили знающие люди, но Ваши примеры натолкнули меня на мысль это проверить. Так что спасибо большое за примеры.
Спасибо! Интересный урок
Привет. Есть ли возможность создавать функции, которые возвращают разные по типу таблиц данные? Простой пример: входящяя текстовая переменная функции принимает разные Sql запросы, внутри тела функции выполняется и выводит результат. Так как запросы разные, то и тип результата отличается.
Не используем конвейерные функции, так как не используем коллекции. А коллекции не используем так как на промышленных объемах (от 100 миллионов/миллиардов строк) быстро переполняется PGA при использовании коллекций в пакетных обработках.
Лучшее решение..это избавиться от коллекций и использовать обычные таблицы или временные))) Работает все намного быстрее плюс параллельность высокая.
Я рекомендую автору провести аналогичные тесты ..используя обычные таблицы и полноценные объемы данных...
Спасибо за комментарий. Именно поэтому я не рекомендую использовать коллекции на больших объемах данных. Автор всё это уже давно исследовал. Тем не менее, это никак не мешает освещению конвейерных функций.
В сложных запросах, которые выгребают много данных используем динамически собираемый select
И возвращаем из процедуры в сисрефкурсор
Есть вопрос по поводу конвеерных функций.
Если мы хотим коллекцию использовать в запросе, то не лучше ли избегать табличных функций и конвеерных в частности в пользу вьюх? Вообще если мы можем SQL-ем обойтись, то нужны ли функции?
Спасибо, что поделились. По поводу вопроса. Зависит от ситуации. Например, вы хотите дать API, которое бы на вход принимало и выполняло строго определенные запросы (с хинтами), например. Можно даже кастомно логировать, кто запрашивал данные, не настраивая FGA. Почему нет. Наверняка, можно придумать еще кейсы, где бы табличные функции были более предпочтительней. В большинстве случаю - view подойдут.
А что за ПО для сравнения на 11:56?
Araxis Merge
Всем привет на 08:06 вижу get_session_pga , в ней запрос без фильтра по v$statname, по номеру или наименованию статистики, разве это верно?
Николай, спасибо! Удивительно как я пропустил... поправил в репозитории. В видео уже, к сожалению, не исправить. Цифры плюс минус те же получились.
Итоговый вариант:
create or replace function get_session_pga return number as
v_pga_size number;
begin
select sum(round(s.value / 1024))
into v_pga_size
from sys.v$sesstat s
,sys.v$statname n
where s.statistic# = n.statistic#
and sid = sys_context('USERENV', 'SID')
and lower(n.name) = 'session pga memory';
return v_pga_size;
end;
/
@@OracleDBD я часто смотрю разные лекции, такое бывает, обычно в закрепе авторы о неточностях комментарии оставляют, это нормальная практика )