Задача:
Опять вопрос на поговорить.
Расскажите про код ниже.
#задача
Опять вопрос на поговорить.
Расскажите про код ниже.
declareНе удивляйтесь, это вопрос с реального собеседования.
...
begin
select count(id) into v_cnt
from my_data
where id_type = v_id_type;
exception
when no_data_found then
v_cnt := 0;
end;
#задача
Друзья, всем привет!
По идеи, сегодня я должен рассказать про решение задачки вторника.
Мне оcобо нечего добавить к тем комментариям, которые и так были под постом.
Самый очевидный вариант - это избыточность проверки на no_data_found.
Но мне понравились рассуждения и нестандартные подходы. Например, Alexei Onin.
Рекомендую заглянуть в обсуждение поста вторника.
В целом, меня радует тенденция, что в сообществе есть активные участники.
Для тех, кто боится высказывать своё мнение. Мы все учимся.
В нашей культуре совершение ошибок почему-то считается чем-то порочным и плохим. Ошибки - это нормально. Мы на них учимся.
Тем более, что все мы лажаем время от времени, вне зависимости от возраста или квалификации. Все мы люди.
Минутка философии. Сорян 😊
#решения
По идеи, сегодня я должен рассказать про решение задачки вторника.
Мне оcобо нечего добавить к тем комментариям, которые и так были под постом.
Самый очевидный вариант - это избыточность проверки на no_data_found.
Но мне понравились рассуждения и нестандартные подходы. Например, Alexei Onin.
Рекомендую заглянуть в обсуждение поста вторника.
В целом, меня радует тенденция, что в сообществе есть активные участники.
Для тех, кто боится высказывать своё мнение. Мы все учимся.
В нашей культуре совершение ошибок почему-то считается чем-то порочным и плохим. Ошибки - это нормально. Мы на них учимся.
Тем более, что все мы лажаем время от времени, вне зависимости от возраста или квалификации. Все мы люди.
Минутка философии. Сорян 😊
#решения
Друзья, всем привет!
На всякий случай, напоминаю, что сегодня в 23:00 исчезнет возможность попасть на первый поток курса “Oracle PL/SQL.Основы”.
Следующий запуск потока будет только в 2022. Зачем ждать 4е месяца, если можно начать менять свою жизнь уже сейчас? 😉
Не уверены? Еще есть время зарегистрироваться на обучающей платформе и посмотреть три первых урока - бесплатно.
Всем хороших выходных!
➡️Изучить PL/SQL в этом году ⬅️
#обучение #plsql
На всякий случай, напоминаю, что сегодня в 23:00 исчезнет возможность попасть на первый поток курса “Oracle PL/SQL.Основы”.
Следующий запуск потока будет только в 2022. Зачем ждать 4е месяца, если можно начать менять свою жизнь уже сейчас? 😉
Не уверены? Еще есть время зарегистрироваться на обучающей платформе и посмотреть три первых урока - бесплатно.
Всем хороших выходных!
➡️Изучить PL/SQL в этом году ⬅️
#обучение #plsql
Задача
Всем привет! Задачка с собеса.
Нужно написать запрос, с использованием таблицы dual, который выведет календарь текущего месяца с первого по последнее число. Язык дней недели - украинский 😁
Пример вывода для текущей даты - 25.09 (две колонки):
#задача
Всем привет! Задачка с собеса.
Нужно написать запрос, с использованием таблицы dual, который выведет календарь текущего месяца с первого по последнее число. Язык дней недели - украинский 😁
Пример вывода для текущей даты - 25.09 (две колонки):
01.09.2021 СЕРЕДАОбсуждение под постом. Решение в четверг 🎓
02.09.2021 ЧЕТВЕР
03.09.2021 П'ЯТНИЦЯ
04.09.2021 СУБОТА
05.09.2021 НЕДІЛЯ
…
30.09.2021 ЧЕТВЕР
#задача
Задача: вывести календарь за текущий месяц с использованием таблицы dual. Подробно см. постановку в посте.
Решение (например, такое):
2️⃣ trunc(sysdate, 'mm') - первый день текущего месяца.
add_months(trunc(sysdate, 'mm'), 1) - первый день следующего месяца.
select trunc(sysdate, 'mm') + level - 1 - каждый уровень иерархии даст день месяца.
3️⃣ Для вывода дат в определенном формате, используем функцию to_char с указанием формата. В случае, с выводом дня недели добавляем опцию украинского языка.
Задача не сильно сложная, но затрагивает разные моменты по написанию запросов. Всем отписавшимся под постом вторника - респект 🔥
Палец вверх, если понравилась задачка 👍
#решениезадачи #иерархическиезапросы #to_char
Решение (например, такое):
select to_char(ddate, 'dd.mm.YYYY') dday1️⃣ В таблице dual хранится только одна строка. Для того, чтобы вывести календарь нам нужно сгенерировать строки с использованием иерархического запроса - connect by level. Количество строк будет определяться как разница между первым днем текущего месяца и первым днем следующего.
,to_char(ddate, 'DAY', 'nls_date_language = UKRAINIAN') day
from (select trunc(sysdate, 'mm') + level - 1 ddate
from dual
connect by level <= add_months(trunc(sysdate, 'mm'), 1) -
trunc(sysdate, 'mm')) x
order by x.ddate;
2️⃣ trunc(sysdate, 'mm') - первый день текущего месяца.
add_months(trunc(sysdate, 'mm'), 1) - первый день следующего месяца.
select trunc(sysdate, 'mm') + level - 1 - каждый уровень иерархии даст день месяца.
3️⃣ Для вывода дат в определенном формате, используем функцию to_char с указанием формата. В случае, с выводом дня недели добавляем опцию украинского языка.
Задача не сильно сложная, но затрагивает разные моменты по написанию запросов. Всем отписавшимся под постом вторника - респект 🔥
Палец вверх, если понравилась задачка 👍
#решениезадачи #иерархическиезапросы #to_char
👍1
Задача на чтение планов запросов.
Для тех кто знает - элементарная.
Опять же, с реального собеседования.
Вопрос формулировался так: “расскажите как можно больше об этом плане”.
Комментарии приветствуются ⬇️😉
Разбор в четверг 🎓
План на скрине. Форматтер ТГ его просто размажет.
#задача
Для тех кто знает - элементарная.
Опять же, с реального собеседования.
Вопрос формулировался так: “расскажите как можно больше об этом плане”.
Комментарии приветствуются ⬇️😉
Разбор в четверг 🎓
План на скрине. Форматтер ТГ его просто размажет.
#задача
❤1
Всем привет!
Немного задержался с решением задачки. Постановку см. в посте 05.10.
Пройдемся по плану:
▫️ строка collection iterator говорит, о том что на шаге происходит работа с коллекцией.
▫️ pickler fetch - работа с “обработанной”/“форматированной”/”подготовленной” коллекцией, полученной из табличной функции.
▫️ num2tbl - табличная функция.
▫️ 8168 - предполагаемое количество элементов коллекции.
Код для воспроизведения:
collection iterator constructor fetch
Пример:
Это предполагаемое количество и оно, чаще всего, не совпадает с реальным значением. Ну и что с того? А то что, оптимизатор может построить неверный план. И вместо, скажем nested loops join, будет выбран hash join. Что приведет к деградации времени выполнения запроса.
Как с этим бороться?
Например, дать подсказку оптимизатору, хотя бы о порядке элементов коллекции.
Хинт cardinality может помочь. Например, так:
Он пока в разработке. Если интересно поучаствовать в пилотной группе - пишите в личку.
Хорошую статью закинул @alexeionin. Посмотрите на досуге.
Всем хорошей трудовой недели! 👍💻
#решениезадачи #cardinality #оптимизация
Немного задержался с решением задачки. Постановку см. в посте 05.10.
Пройдемся по плану:
▫️ строка collection iterator говорит, о том что на шаге происходит работа с коллекцией.
▫️ pickler fetch - работа с “обработанной”/“форматированной”/”подготовленной” коллекцией, полученной из табличной функции.
▫️ num2tbl - табличная функция.
▫️ 8168 - предполагаемое количество элементов коллекции.
Код для воспроизведения:
create or replace type t_numbers is table of number(38);Если же в запросе не используется табличная функция, а выборка идет из коллекции, описание шага в плане будет:
/
create or replace function num2tbl return t_numbers
is
begin
return t_numbers(1, 2, 3, 4, 5);
end;
/
select * from table(num2tbl());
collection iterator constructor fetch
Пример:
select * from t_numbers(1, 2, 3, 4, 5);Насчет числа 8168
Это предполагаемое количество и оно, чаще всего, не совпадает с реальным значением. Ну и что с того? А то что, оптимизатор может построить неверный план. И вместо, скажем nested loops join, будет выбран hash join. Что приведет к деградации времени выполнения запроса.
Как с этим бороться?
Например, дать подсказку оптимизатору, хотя бы о порядке элементов коллекции.
Хинт cardinality может помочь. Например, так:
select /*+ cardinality(t 5) */ * from table(num2tbl()) t;Более подробно об этом и других хинтах, я расскажу в своем курсе по оптимизации.
Он пока в разработке. Если интересно поучаствовать в пилотной группе - пишите в личку.
Хорошую статью закинул @alexeionin. Посмотрите на досуге.
Всем хорошей трудовой недели! 👍💻
#решениезадачи #cardinality #оптимизация
Задача
На этот раз вопрос не с собеседования, а из реальной практики. Если вы плотно работаете с СУБД Oracle вы обязательно столкнетесь с подобным.
Дан план. Выполняется некий select по таблице.
что можете сказать про этот план? Гуд? Можно лучше? Если можно, то как?
Задачка совмещает в себе знания по чтению планов и не простую тему с секционированием таблиц.
Детали решения в четверг 🎓
#задача #секционирование
На этот раз вопрос не с собеседования, а из реальной практики. Если вы плотно работаете с СУБД Oracle вы обязательно столкнетесь с подобным.
Дан план. Выполняется некий select по таблице.
что можете сказать про этот план? Гуд? Можно лучше? Если можно, то как?
Задачка совмещает в себе знания по чтению планов и не простую тему с секционированием таблиц.
Детали решения в четверг 🎓
#задача #секционирование
Задача: смотрите постановку и план запроса в посте вторника.
Анализ:
Для начала пройдемся по плану.
🔸 SALE - источник данных - таблица.
🔸PARTITION RANGE - говорит о том, что таблица Range-секционированная (по диапазону).
🔸ALL - происходит просмотр всех секций.
🔸Pstart = 1 и Pstop = 1048575 - начинается сканирование с первой секции и доходит до самой последней. Максимум секций может быть 1М.
🔸С учетом того, что отображается Pstop = максимальному количеству секций, можно сделать вывод, о том что применена опция Range-секционирования - интервальное или автоматическое секционирование.
🔸звездочка на 2й позиции - означает, что есть какое-то дополнительное условие фильтрации.
🔸Доступ TABLE ACCESS FULL, говорит об отсутствии индекса или его бесполезности при фильтрации строк (звездочка) каждой секции.
🔸Финальная операция выполнения запроса - select.
Итого, мы имеем полное сканирование всех секций интервальной секционированной таблицы Sale.
Что должно вас насторожить? Слово “всех”.
Такое возможно, когда не задан ключ секционирования в условии where, т.е. не происходит отсечение секций. Очень распространенная ошибка среди "писателей" запросов.
Ключ секционирования - поле(я), по которому мы разбиваем таблицу на под-таблицы(секции). Наша задача - сканировать как можно меньше секций. В идеале - одну.
Для этого нужно:
🔸уметь правильно задавать секционирование таблицам;
🔸писать правильные запросы, отсекающие лишние секции.
TABLE ACCESS FULL - сам по себе ни хорош ни плох. Существует ряд ситуаций, когда он вполне себе допустим.
Летом я проводил 3х дневный интенсив на тему секционирования, на котором мы разбирали оба вопроса. По отзывам ребят, тема зашла и приносит пользу в повседневной работе. Как-нибудь опубликую отзывы.
Возможно, проведу обучение еще разок. Если что пишите.
Если задачка понравилась ставьте палец вверх 👍
#решениезадачи #секционирование
Анализ:
Для начала пройдемся по плану.
🔸 SALE - источник данных - таблица.
🔸PARTITION RANGE - говорит о том, что таблица Range-секционированная (по диапазону).
🔸ALL - происходит просмотр всех секций.
🔸Pstart = 1 и Pstop = 1048575 - начинается сканирование с первой секции и доходит до самой последней. Максимум секций может быть 1М.
🔸С учетом того, что отображается Pstop = максимальному количеству секций, можно сделать вывод, о том что применена опция Range-секционирования - интервальное или автоматическое секционирование.
🔸звездочка на 2й позиции - означает, что есть какое-то дополнительное условие фильтрации.
🔸Доступ TABLE ACCESS FULL, говорит об отсутствии индекса или его бесполезности при фильтрации строк (звездочка) каждой секции.
🔸Финальная операция выполнения запроса - select.
Итого, мы имеем полное сканирование всех секций интервальной секционированной таблицы Sale.
Что должно вас насторожить? Слово “всех”.
Такое возможно, когда не задан ключ секционирования в условии where, т.е. не происходит отсечение секций. Очень распространенная ошибка среди "писателей" запросов.
Ключ секционирования - поле(я), по которому мы разбиваем таблицу на под-таблицы(секции). Наша задача - сканировать как можно меньше секций. В идеале - одну.
Для этого нужно:
🔸уметь правильно задавать секционирование таблицам;
🔸писать правильные запросы, отсекающие лишние секции.
TABLE ACCESS FULL - сам по себе ни хорош ни плох. Существует ряд ситуаций, когда он вполне себе допустим.
Летом я проводил 3х дневный интенсив на тему секционирования, на котором мы разбирали оба вопроса. По отзывам ребят, тема зашла и приносит пользу в повседневной работе. Как-нибудь опубликую отзывы.
Возможно, проведу обучение еще разок. Если что пишите.
Если задачка понравилась ставьте палец вверх 👍
#решениезадачи #секционирование
Всем привет!
Заметили, что постов не было? 😊
Подкосил меня один известный вирусок 🦠 Потихоньку восстанавливаюсь...
Что б сильно не скучали, расскажу про кейс одного из моих студентов. Упростил очень сильно для примера.
Дан PL/SQL-блок. Меняется таблица payment_detail. Она существует, в ней есть записи.
Определение таблицы можно посмотреть здесь.
#задача
Заметили, что постов не было? 😊
Подкосил меня один известный вирусок 🦠 Потихоньку восстанавливаюсь...
Что б сильно не скучали, расскажу про кейс одного из моих студентов. Упростил очень сильно для примера.
Дан PL/SQL-блок. Меняется таблица payment_detail. Она существует, в ней есть записи.
declareЧто можете сказать про этот код? Все ли с ним в порядке?
v_payment_id payment.payment_id%type := 121;
v_field_id payment_detail.field_id%type := 2;
begin
update payment_detail
set field_value = 'xxxx'
where v_payment_id = v_payment_id
and field_id = v_field_id;
end;
/
Определение таблицы можно посмотреть здесь.
#задача
Задача: постановку смотрите в посте вторника.
Решение:
В примере показана, довольно часто, встречающаяся ошибка у новичков.
Задумка автора: обновить значение в поле для клиента “121” с ID поля равным “2”.
По какой-то причине, автор указал “v_payment_id = v_payment_id” вместо “payment_id = v_payment_id”.
Если преобразовать исходный запрос получится:
Неприятно 😕
Как бороться?
1️⃣ Внимательность при написании запросов.
2️⃣ Тестирование кода.
3️⃣ Code-review в команде.
4️⃣ Статические анализаторы кода. Например, SonarQube. Он, совершенно точно, умеет понимать такие ошибки.
Кстати, если интересно могу как-нибудь запилить видос с SonarQube 🎥
Всем хорошего дня!
#решениезадачи
Решение:
В примере показана, довольно часто, встречающаяся ошибка у новичков.
Задумка автора: обновить значение в поле для клиента “121” с ID поля равным “2”.
По какой-то причине, автор указал “v_payment_id = v_payment_id” вместо “payment_id = v_payment_id”.
Если преобразовать исходный запрос получится:
update payment_detailФактически первое условие можно отбросить, потому как оно всегда истинно. Таким образом, произойдет обновление всех строк в таблице payment_detail с field_id = “2”.
set field_value = 'xxxx'
where 121 = 121
and field_id = v_field_id;
Неприятно 😕
Как бороться?
1️⃣ Внимательность при написании запросов.
2️⃣ Тестирование кода.
3️⃣ Code-review в команде.
4️⃣ Статические анализаторы кода. Например, SonarQube. Он, совершенно точно, умеет понимать такие ошибки.
Кстати, если интересно могу как-нибудь запилить видос с SonarQube 🎥
Всем хорошего дня!
#решениезадачи
Задача: дано три DML-триггера на некую таблицу some_tab.
Нужно чтобы при вставке в буфере вывода было: CBA
A - никак не сделать, триггеры срабатывают в случайной последовательности.
B - триггеры нужно создать в той очередности, в которой нужно срабатывание.
C - есть опция Ordered в синтаксисе триггера, которая указывает очередность.
D - есть другая опция в синтаксисе триггера, которая указывает очередность.
Обсуждение задачи в четверг 🎓
#задача
Нужно чтобы при вставке в буфере вывода было: CBA
create table some_tabВарианты:
(
some_col number(38) not null
);
create or replace trigger some_tab_trg_A
after insert
on some_tab
begin
dbms_output.put_line('A');
end;
/
create or replace trigger some_tab_trg_C
after insert
on some_tab
begin
dbms_output.put_line('C');
end;
/
create or replace trigger some_tab_trg_B
after insert
on some_tab
begin
dbms_output.put_line('B');
end;
/
insert into some_tab values(1);
A - никак не сделать, триггеры срабатывают в случайной последовательности.
B - триггеры нужно создать в той очередности, в которой нужно срабатывание.
C - есть опция Ordered в синтаксисе триггера, которая указывает очередность.
D - есть другая опция в синтаксисе триггера, которая указывает очередность.
Обсуждение задачи в четверг 🎓
#задача
Очередность срабатывания триггеров
Задача: см постановку в посте вторника.
Решение
В Oracle 11g, в синтаксисе создания триггера, появилась опция FOLLOWS.
Ей можно задать за каким триггером срабатывать текущему.
Итого:
Ссылка на доку под постом ⬇️
#решениезадачи #trigger
Задача: см постановку в посте вторника.
Решение
В Oracle 11g, в синтаксисе создания триггера, появилась опция FOLLOWS.
Ей можно задать за каким триггером срабатывать текущему.
Итого:
create or replace trigger some_tab_trg_AВозможно, вам где-то это пригодится 😉
after insert
on some_tab
follows some_tab_trg_B
begin
dbms_output.put_line('A');
end;
/
create or replace trigger some_tab_trg_C
after insert
on some_tab
begin
dbms_output.put_line('C');
end;
/
create or replace trigger some_tab_trg_B
after insert
on some_tab
follows some_tab_trg_C
begin
dbms_output.put_line('B');
end;
/
Ссылка на доку под постом ⬇️
#решениезадачи #trigger
Всем привет!
Вполне вероятно, что, проходя собеседование на DBD или Backend-разработчика вы можете столкнуться с таким вопросом:
“Какая разница между UNION и UNION ALL с точки зрения оптимизации?”
Что ответите?
Разбор задачи с планами запросов, как обычно, в четверг 🎓
Не переключайтесь 😉
—
Интересно вам уже задавали на собесе этот вопрос? Голосовалка под постом 📊
#задача
Вполне вероятно, что, проходя собеседование на DBD или Backend-разработчика вы можете столкнуться с таким вопросом:
“Какая разница между UNION и UNION ALL с точки зрения оптимизации?”
Что ответите?
Разбор задачи с планами запросов, как обычно, в четверг 🎓
Не переключайтесь 😉
—
Интересно вам уже задавали на собесе этот вопрос? Голосовалка под постом 📊
#задача
Разница между UNION и UNION ALL с точки зрения оптимизации
Постановка задачи в посте вторника.
Начнем с простого. Что это за операции?
▫️UNION - объединяет два множества, оставляет только уникальные значения.
▫️UNION ALL - объединяет два множества, значения не уникальны, т.е. могут быть повторы.
Пока разница очевидна.
Пример:
За счет дополнительного шага сортировки. И это прекрасно видно в плане запроса. После шага UNION-ALL выполняется SORT.
Я всегда говорю, если вам сортировка не требуется, то не надо её делать. Избавляемся от лишних сортировок.
⚠️ Возьмите за правило, использовать по умолчанию операцию UNION ALL, которая не выполняет сортировку. Только, если по бизнес-процессу требуется уникальность значений используйте UNION. Помогите СУБД избавиться от лишней работы 😉
#оптимизация #union #unionall
Постановка задачи в посте вторника.
Начнем с простого. Что это за операции?
▫️UNION - объединяет два множества, оставляет только уникальные значения.
▫️UNION ALL - объединяет два множества, значения не уникальны, т.е. могут быть повторы.
Пока разница очевидна.
Пример:
select some_col1 from tab1Давайте подумаем, а в чем различие операций на уровне выполнения. За счет чего достигается уникальность отдаваемых значений в UNION?
union
select some_col1 from tab2;
За счет дополнительного шага сортировки. И это прекрасно видно в плане запроса. После шага UNION-ALL выполняется SORT.
Я всегда говорю, если вам сортировка не требуется, то не надо её делать. Избавляемся от лишних сортировок.
⚠️ Возьмите за правило, использовать по умолчанию операцию UNION ALL, которая не выполняет сортировку. Только, если по бизнес-процессу требуется уникальность значений используйте UNION. Помогите СУБД избавиться от лишней работы 😉
#оптимизация #union #unionall
Друзья, всем привет!
Сегодняшний пост про внутреннюю жизнь канала.
1️⃣ Нативная реклама от Telegram
Телеграм стал монетизировать свою аудиторию. Начали размещать объявления в каналах. Когда вы видите рекламный пост с пометкой sponsored (как на скрине выше), это вот оно. Я не могу повлиять на ее отображение. Прошу отнестись к этому с пониманием.
Я иногда, размещаю рекламные посты с тегом #реклама. Деньги идут на продвижение канала, ибо для меня это не бесплатно. И да, расходы больше чем доходы.
2️⃣ Комментарии к постам
К сожалению, не ко всем постам добавляются нативные комментарии. Если пост с голосованием или ссылками в виде кнопки, то плашка с комментами не отображается.
Но! есть выход. Вы можете вступить в чат канала. И тогда у вас появится возможность комментировать любой пост в канале. Некоторое количество подписчиков уже там.
Нужно жямкнуть свойства канала -> View discussion -> Join group
Велком!
Кстати, в понедельник, будет кое-что интересное 😉
Всем хороших выходных! 👯♀️
Сегодняшний пост про внутреннюю жизнь канала.
1️⃣ Нативная реклама от Telegram
Телеграм стал монетизировать свою аудиторию. Начали размещать объявления в каналах. Когда вы видите рекламный пост с пометкой sponsored (как на скрине выше), это вот оно. Я не могу повлиять на ее отображение. Прошу отнестись к этому с пониманием.
Я иногда, размещаю рекламные посты с тегом #реклама. Деньги идут на продвижение канала, ибо для меня это не бесплатно. И да, расходы больше чем доходы.
2️⃣ Комментарии к постам
К сожалению, не ко всем постам добавляются нативные комментарии. Если пост с голосованием или ссылками в виде кнопки, то плашка с комментами не отображается.
Но! есть выход. Вы можете вступить в чат канала. И тогда у вас появится возможность комментировать любой пост в канале. Некоторое количество подписчиков уже там.
Нужно жямкнуть свойства канала -> View discussion -> Join group
Велком!
Кстати, в понедельник, будет кое-что интересное 😉
Всем хороших выходных! 👯♀️
Друзья, всем привет!
Я уже давно “закидывал удочку” на тему авторских постов в канале. Давайте еще раз озвучу мысль 💡
У нас тут абсолютно разные люди - по специализациям, по уровню знаний, по уникальному опыту. Этим можно было поделиться с другими коллегами.
Я даю возможность любому желающему опубликовать свой пост, задачу\решение, вопрос с собеседования или что-то другое интересное для аудитории канала. Естественно, с указанием автора.
Это отличная возможность, поделиться вашими знаниями, получить обратную связь, пообщаться с коллегами 💬
Конечно, есть определенные правила, налагаемые в основном, форматом Telegram. Посты должны быть краткими, отформатированными, отражающими суть. Как форматировать посты можно посмотреть на примере моих. Все это обсуждается в личке.
В эту среду, я опубликую пост от нашего подписчика. Это будет первый пост подобного рода 👍
Хочу напомнить, что в этом канале нет места негативу, наоборот, приветствуется поддержка и конструктивные замечания.
Всем хорошей недели!
Я уже давно “закидывал удочку” на тему авторских постов в канале. Давайте еще раз озвучу мысль 💡
У нас тут абсолютно разные люди - по специализациям, по уровню знаний, по уникальному опыту. Этим можно было поделиться с другими коллегами.
Я даю возможность любому желающему опубликовать свой пост, задачу\решение, вопрос с собеседования или что-то другое интересное для аудитории канала. Естественно, с указанием автора.
Это отличная возможность, поделиться вашими знаниями, получить обратную связь, пообщаться с коллегами 💬
Конечно, есть определенные правила, налагаемые в основном, форматом Telegram. Посты должны быть краткими, отформатированными, отражающими суть. Как форматировать посты можно посмотреть на примере моих. Все это обсуждается в личке.
В эту среду, я опубликую пост от нашего подписчика. Это будет первый пост подобного рода 👍
Хочу напомнить, что в этом канале нет места негативу, наоборот, приветствуется поддержка и конструктивные замечания.
Всем хорошей недели!
Функции SQL vs Функции PL/SQL
Всем привет!
Вы уже задумывались о различиях между стандартными SQL и PL/SQL функциями? «А разве, между ними существуют различия?» - спросит новичок.
⚠️ Да, это разные функции и иногда они ведут себя по-разному.
В Oracle Database, как известно, есть два разных движка: для выполнения SQL-запросов и для PL/SQL-кода. Как все знают, следует избегать лишних переключения между этими движками. Чтобы таких переключений происходило как можно меньше, для SQL и PLSQL имеются свои реализации стандартных функций, описанных в документации. Они работают почти всегда одинаково и в обычной практике мы их не различаем, Например:
1️⃣ В PL/SQL может не оказаться соответствующей функции из SQL. Например, вы не сможете в PL/SQL-коде напрямую вызвать SQL-функции NVL2 и DECODE. Видимо, разработчики не стали включать в состав языка эти функции посчитав достаточно универсальной конструкцию CASE. Наличие интересующей функции можно проверить в пакете SYS.STANDARD. Также можно обратиться к документации на язык PL/SQL и проверить вызов на практике в обычном анонимном PL/SQL-блоке.
2️⃣ В SQL может не оказаться "своей" вызываемой функции. В таком случае можно попробовать обратиться к PL/SQL-функции напрямую через пакет SYS.STANDARD. Например:
3️⃣ Одноимённые реализации функции в SQL и PL/SQL-движках могут выдавать разные результаты. К сожалению, такое иногда встречается, поскольку каждую из реализаций внутри Oracle Database писали и поддерживали разные люди. Я натыкался на различия в результатах для функции
✅Пожалуйста, напишите в комментариях, встречалось ли вам что-то подобное.
Автор: @alexeionin
#функции
Всем привет!
Вы уже задумывались о различиях между стандартными SQL и PL/SQL функциями? «А разве, между ними существуют различия?» - спросит новичок.
⚠️ Да, это разные функции и иногда они ведут себя по-разному.
В Oracle Database, как известно, есть два разных движка: для выполнения SQL-запросов и для PL/SQL-кода. Как все знают, следует избегать лишних переключения между этими движками. Чтобы таких переключений происходило как можно меньше, для SQL и PLSQL имеются свои реализации стандартных функций, описанных в документации. Они работают почти всегда одинаково и в обычной практике мы их не различаем, Например:
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
#функции
Telegram
Oracle Developer👨🏻💻
Пакет sys.standard
Довольно интересный системный пакет.
Содержит в себе определения типов, функций, именованных исключений и много чего другого. Можно сказать, все определение языка PL/SQL =)
Станем понятно, что за тип STRING или например, VARRAY. Чем они…
Довольно интересный системный пакет.
Содержит в себе определения типов, функций, именованных исключений и много чего другого. Можно сказать, все определение языка PL/SQL =)
Станем понятно, что за тип STRING или например, VARRAY. Чем они…
Друзья, всем привет!
А у нас сегодня вакансия с релокейтом в Гданьск (Польша). Вдруг кто-то хочет поменять локацию? Ну, вдруг 😉
Кратко, чем необходимо заниматься: миграция с разных СУБД в облако от Амазона.
Причем судя по описанию, ребята готовы обучать: No previous cloud experience is required for this job
В общем, если интересно, пишите @Distorge
https://jobs-us-east.amazon.com/es/jobs/1676280/database-engineer-aws-database-migration-accelerator
#вакансия
А у нас сегодня вакансия с релокейтом в Гданьск (Польша). Вдруг кто-то хочет поменять локацию? Ну, вдруг 😉
Кратко, чем необходимо заниматься: миграция с разных СУБД в облако от Амазона.
Причем судя по описанию, ребята готовы обучать: No previous cloud experience is required for this job
В общем, если интересно, пишите @Distorge
https://jobs-us-east.amazon.com/es/jobs/1676280/database-engineer-aws-database-migration-accelerator
#вакансия