Oracle Developer👨🏻‍💻
3.22K subscribers
608 photos
68 videos
2 files
486 links
🔝 канал о разработке в СУБД Oracle:
SQL, PL/SQL, оптимизация, архитектура и многое другое...

Backend-pro.ru - обучение по различным программам, связанных с backend-разработкой для ФЛ и ЮЛ.

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
💡 Хранимая процедура с секретом – разберешься?

Друзья, всем привет! 👋

Прошлая неделя прошла под флагом PL/SQL-марафона (подробности были тут). Судя по отзывам, он вам зашел! 🚀 Мы уже готовим серию вебинаров на откликнувшиеся вам темы. 🔥 Но перед этим — небольшая задачка, решение которой вам скоро пригодится 😉

Итак,
💡 Задача:
Нужно написать хранимую процедуру, которая принимает параметр любого типа и выводит его значение на экран.
⭐️ Дополнительное задание для знатоков: если параметр типа nested table, вывести количество записей в коллекции.

Простая задача? Давайте проверим! 😏

Делитесь своими решениями в нашем чатике 💬

📅 Разбор задачи будет в четверг, так что следите за обновлениями! 👀

#PLSQL #Oracle #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик💬
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42👍1
💡 Хранимая процедура с секретом – разберешься?

Друзья, всем привет! 👋

Во вторник мы подкинули вам задачку про гибкие параметры хранимых процедур в Oracle. Спасибо всем, кто прислал решение и принял участие в жаркой 🔥 дискуссии! Многие сразу догадались, что речь идёт про ANYDATA. Но главный вопрос: а зачем это вообще нужно на практике? 🤔

У меня есть для вас один интересный кейс, и уже в следующий четверг мы обязательно его обсудим. Следите за анонсами! 📅

А пока разберёмся с ANYDATA и решением задачки.

💡Что такое ANYDATA

Это универсальный контейнер для данных, который позволяет хранить и передавать значения разных типов: строки, числа, коллекции и даже объекты. Это удобно, когда нужно работать с разными структурами данных без жёсткой привязки к конкретному типу.

Когда может быть полезен

🔶 интеграции, API
🔶 EAV-архитектура
🔶 многослойные пользовательские интерфейсы, и т.п.

Основное преимущество для разработчика — отсутствие необходимости хранить метаданные, а также самому реализовывать валидацию и парсинг пользовательских данных. Anydata берет всё это на себя! 🚀

А теперь решение задачки 📚

1️⃣ Процедура с параметром

CREATE OR REPLACE PROCEDURE p_get_anydata_value
(
p_param IN anydata
) IS
l_anytype anytype;
l_typecode PLS_INTEGER;
l_varchar_value VARCHAR2(255 Char);
l_num_value NUMBER;
l_collection t_numbers;
l_status VARCHAR2(64 CHAR);
BEGIN
-- Проверяем тип данных в ANYDATA
l_typecode := p_param.GetType(l_anytype);

IF l_typecode IN (dbms_types.TYPECODE_NAMEDCOLLECTION
,dbms_types.TYPECODE_TABLE) THEN
-- Извлекаем коллекцию
IF p_param.GetCollection(l_collection) = dbms_types.SUCCESS THEN
l_status := 'record_count=' || l_collection.count();
ELSE
l_status := 'ошибка извлечения коллекции';
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_VARCHAR2 THEN
IF p_param.GetVarchar2(l_varchar_value) = dbms_types.SUCCESS THEN
l_status := l_varchar_value;
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_NUMBER THEN
IF p_param.GetNumber(l_num_value) = dbms_types.SUCCESS THEN
l_status := l_num_value;
END IF;
ELSE
l_status := 'неподдерживамый тип параметра';
END IF;
dbms_output.put_line(l_status);
END p_get_anydata_value;
/


2️⃣ Пример вызова

create or replace type t_numbers is table of number;
/

begin
dbms_output.put_line('anydata.ConvertNumber:');
p_get_anydata_value(anydata.ConvertNumber(25));
dbms_output.put_line('anydata.ConvertVarchar2:');
p_get_anydata_value(anydata.ConvertVarchar2('Это строка'));
dbms_output.put_line('anydata.ConvertCollection:');
p_get_anydata_value(anydata.ConvertCollection(t_numbers(1, 2, 3, 4, 5)));
end;
/


3️⃣ Вывод в консоль

anydata.ConvertNumber:
25
anydata.ConvertVarchar2:
Это строка
anydata.ConvertCollection:
record_count=5


🔥 Как вам задачка? Возможно, у вас тоже есть интересные кейсы с ANYDATA? Или вы придумали, как его использовать в своём проекте? Делитесь мнением в нашем чатике 💬

#PLSQL #Oracle #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141
💡 Как не завалить первое интервью и получить оффер?

Друзья, всем привет! 👋

Весна в самом разгаре 🌱, всё вокруг обновляется, и многие из вас начинают задумываться о смене работы.
Как вы помните, я уже не раз делился внутрянкой найма ораклистов в РФ.
Меня до сих пор спрашивают в личке, как сейчас обстоят дела на рынке и к чему готовиться на собеседовании.

Об этом мы сегодня и поговорим 💬

📌 1. Технический блок собеседования: что спрашивают?

❗️ Прежде всего, хочу напомнить, что осенью я уже выпускал подробные посты и видео-интервью на эту тему: раз, два, три, четыре, пять.

Если вы их ещё не читали или не смотрели — очень советую.

Во-первых, никаких кардинальных изменений в технических вопросах с того времени не произошло.

🔍 По-прежнему спрашивают про:
Коллекции (ассоциативные массивы, вложенные таблицы, varrays)
Курсоры (явные, неявные, REF CURSOR)
Юнит-тестирование в PL/SQL
Планы запросов и индексы (оптимизация, статистика, cost-based optimizer)
Секционирование

Во-вторых, успешное прохождение собеседований — это тоже навык, который требует тренировки. Поэтому будет полезно нажать на паузу и подумать: а как бы ты ответил на этот вопрос? 🤔

📌 2. Сегодняшний рынок — на стороне работодателя

Если вы были на наших карьерных вебинарах, то уже знаете: рынок сейчас на стороне работодателя. И если раньше он мог закрыть глаза на небольшие пробелы, то теперь ищет сильных специалистов.
Поэтому важно не просто отвечать на вопросы, а делать это лучше остальных кандидатов.

Как думаете, кому охотнее сделают оффер?
😎 Кандидату, который ответил на все вопросы за 10 минут?
😬 Или тому, кто мямлил и чесал репу, вспоминая, чем отличается FOR от FORALL?

А кому будут подкидывать каверзные вопросы, типа такого:

Есть две таблицы из одного поля. В таблице A 7 строк, во всех null. В таблице B 5 строк, во всех также null.
Сколько строк вернет запрос из этих двух таблиц с inner join?
C left join?
C right join?
C full join?


📌 3. Готовьтесь заранее!

Наша карьерная фея Люба настоятельно рекомендует готовиться к техническому блоку заранее.💡
Может так случиться, что первое же собеседование окажется тем самым. Будет обидно завалить его из-за мелочей 🤷‍♂️

Если не уверены в своих силах — велком к нам на мок-собеседование.
Сейчас явно не то время, чтобы идти к офферу мечты методом проб и ошибок. 🔥

Друзья, напоминаем вам, что совсем скоро стартует 14-й поток курса Мастер Oracle PL/SQL 🎓
Если вы не знаете:
🔶 как с помощью ассоциативных массивов ускорить работу приложения
🔶 чем отличается dbms_job от dbms_scheduler
🔶 что такое юнит-тесты и зачем они нужны
🔶 как сделать пользовательские блокировки эффективными
🔶 о чем говорит ошибка "состояние пакета было сброшено" и т.п.,

то успевайте 🕙.

Возможно, именно эти знания помогут вам получить оффер вашей мечты. 🚀

Пишите в комментариях, как у вас проходили собеседования, были ли неожиданные вопросы? 💬

#Карьера #Oracle #PLSQL #Собеседование

🔗 Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥2
💡5 шагов к зарплате 200К+ в 2025 году!

Друзья, всем привет! 👋

Я часто получаю вопросы в личке:

«Денис, ну я же нормальный специалист. Опыт 5-7 лет, задачи решаю, тесты пишу, заказчик доволен… Почему я до сих пор сижу на зп 150-180К, а кто-то получает 220-250К — и это считается нормой?»

Отвечаю.

📌 В 2025 году быть просто «нормальным специалистом» уже недостаточно. Если вы хотите ЗП от 220К и выше, вы должны уметь:

Писать качественный и читаемый код, применять паттерны проектирования
Уметь в микросервисную архитектуру, работать с API и интеграциями
Тестировать свой код через юнит-тесты
Иметь навыки оптимизации SQL
И главное — уметь себя продавать на рынке

🔥 И вот вам свежий кейс 🔥

Мы недавно отбирали ребят на курс. Пришел парень — всего 2 года опыта по PL/SQL, но:

🔶 у него системный подход
🔶 рассказал про свой план развития на ближайшие пару лет
🔶 ему все реально интересно
🔶 умеет себя преподнести

💥 Итог: получил оффер на 240К. Без «10 лет в банке», не имея 3х лет стажа и т.п.

Или пример того самого Паши, который в свои 23 со стажем 2,5 года уже зарабатывает 210К и планирует в этом году стать senior-разработчиком.

А теперь вопрос к вам:

👉 Вы держитесь за свои 150К с 5+ годами стажа, потому что боитесь изменений?
👉 Или потому что «ещё не время»?
👉 Или потому что не знаете, с чего начать?
👉🏻 Или просто не хотите инвестировать в свои знания?

Что бы вы ни выбрали, ответ будет один: нужно начать с себя

📅 Уже через 5 дней стартует курс «Мастер Oracle PL/SQL» — последний в этом году.

💡 Что вас ждет на курсе:

Системное обучение PL/SQL от экспертов в своем деле
Теория + очень много практики
Классический Oracle + новинки версии 21с
трехзвенка, API, юнит-тесты
Сертификат об окончании, карьерная поддержка, помощь с резюме
Помощь с подбором вакансий — не останетесь без работы!

💰 Окупаемость курса — 1-2 месяца на вашей новой работе.

Пропустите — и следующая возможность будет только в 2026 году. А это уже другой рынок, другие конкуренты.

📌 Если давно хотели — время пришло!

Пишите в поддержку, увидимся 4 апреля

Удачи! И пусть PL/SQL принесет вам уверенность в завтрашнем дне и достойный доход! 💪

#oracle #plsql #карьера #зарплата #собеседование #резюме #курс

Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤷‍♂2👍2
Anydata в реальном проекте: зачем и как использовать? 🎯

Друзья, всем привет! 👋

На прошлой неделе мы с вами решали задачку про Anydata.
Решение многим понравилось, но вопрос "зачем это вообще нужно на практике?" по-прежнему остается актуальным 🤔

Я обещал подкинуть вам реальный кейс – ловите! 🎯

Представьте: у вас в схеме есть интеграционный пакет, который обменивается данными со сторонним API 🌐
Или, если вам ближе DWH, пусть это будет формирование витрин по расписанию .

Задача простая – запустить произвольный PL/SQL-метод асинхронно или по расписанию.

Но вот загвоздка: каждый метод принимает разные параметры, в т.ч. коллекции, объявленные на уровне схемы.

Какое решение, кроме динамического SQL, вы могли бы предложить

Делитесь своими решениями в нашем чатике 💬

Разбор задачи, как обычно, в четверг 🔥

#Oracle #PLSQL #Anydata #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anydata в реальном проекте: зачем и как использовать? 🎯 Решение задачи

Друзья, всем привет! 👋🏻

Во вторник мы кидали вам практическую задачку по Anydata. Сегодня публикуем обещанное решение 👇🏻

Ключевая идея — использовать dbms_scheduler, т.к. по сравнению с классическим dbms_job он предлагает гораздо больше возможностей:

расширенное логирование запусков
цепочки заданий (chains)
сложные повторения
программы

Более подробно об этом мы говорим на курсе Мастер Oracle PL/SQL.

Что мы делаем конкретно в этой задаче

1️⃣ Используем пакет dbms_describe для анализа метода

Нам понадобится:
🔶 тип данных t_describe
🔶 метод describe_procedure, который проанализирует процедуру и поймет, какие параметры она принимает на вход.

2️⃣ Реализуем маппинг типов данных
Нам нужно сопоставить типы данных Oracle с теми, что поддерживает dbms_scheduler.
В коде за это отвечает метод get_oratype_name.

3️⃣ Создаем программу
Она будет запускать асинхронно или по расписанию произвольный PL/SQL-метод.

4️⃣ Привязываем к программе параметры метода
через dbms_scheduler.define_program_argument.

5️⃣ Создаем джоб
Для передачи параметров используем sys.jobarg_array, основанный на объекте sys.jobarg.

Пример вызова процедуры:
DECLARE
v_import_data t_credit_table;
v_arguments sys.jobarg_array;

BEGIN
IF v_import_data IS NOT empty THEN
v_arguments := sys.jobarg_array(
sys.jobarg(1, anydata.ConvertCollection(v_import_data)),
sys.jobarg(2, anydata.ConvertChar(const_pkg.c_yes)));

-- Создадим и запустим джоб
user_jobs_pkg.create_user_job(p_program_name => 'p_process_contracts',
p_program_action => $$PLSQL_UNIT || '.run_job',
p_arguments => v_arguments);
END IF;
END;
/


Код пакета user_jobs_pkg в комментариях к этому посту 👇🏻

Коллеги, это решение может показаться громоздким, но оно из серии "сделал и забыл". ✍️
Один раз настроили, отладили - и можно вызывать асинхронно любые методы. Прелесть же?! 😉

Напишите в комментариях, что думаете по этому поводу? 🤔
Если зашло, ставьте по традиции жирный 👍🏻, мы старались.

На этом тему anydata в Oracle считаем закрытой 😊 Сорри, если она вам приелась, но для senior-разработчика это 💯 полезный навык.

Друзья, также напоминаю, что уже завтра стартует счастливый 1️⃣4️⃣ поток курса Мастер Oracle PL/SQL 🚀

Если вы хотите:
🔶 увидеть еще больше кейсов из реальных проектов;
🔶 научиться работать с трехзвенкой;
🔶 посмотреть на новинки в Oracle 21c;
🔶 наконец-то начать писать юнит-тесты;
🔶 запилить в гитхаб свой собственный крутой pet-проект 🤟

, то успевайте 🕙.
Следующая такая возможность будет нескоро. 🤷‍♂️

#Oracle #PLSQL #Anydata #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Пятничный тест по PL/SQL

Коллеги, всем привет!

Давайте разомнемся в пятницу перед выходными 🏋🏻‍♀️
Вопросики по PL/SQL для уровня middle/senior.

Погнали!


А где-то в фоне стартовал 14й поток по PL/SQL. Ребята начинают 2.5 месячное путешествие по просторам PL/SQL. Еще есть время присоединиться 😉
Пиши в поддержку 🚀

#Oracle #PLSQL #Pavel_Dolganov #тест
🔗 Канал Oracle Developer | Чатик 💬
🔥3
1️⃣ вопрос
Forwarded from Pavel V
Вопрос: Что произойдет, если в таблице employees нет сотрудника с employee_id = 1
Anonymous Quiz
28%
Выведется Salary: <NULL>
18%
Выведется Salary: 0
44%
Возникнет ошибка NO_DATA_FOUND
10%
Возникнет ошибка INVALID_CURSOR
👍1
2️⃣ вопрос
Forwarded from Pavel V
👍1🔥1
3️⃣ вопрос
4️⃣ вопрос
Forwarded from Pavel V
Вопрос: Какое значение зарплаты будет у сотрудника с employee_id = 100 после выполнения запроса
Anonymous Quiz
15%
Зарплата увеличится на 20%
27%
Зарплата увеличится на 10%
44%
Зарплата увеличится на 32%
14%
Возникнет ошибка
👍4🔥1
5️⃣ вопрос
Forwarded from Pavel V
Вопрос: Что будет выведено в результате выполнения запроса
Anonymous Quiz
10%
1, 2, 3
54%
3, 2, 1
7%
3, 3, 3
29%
Возникнет бесконечная рекурсия
🔥1
6️⃣ вопрос
Forwarded from Pavel V
Вопрос: укажите минимально и максимально возможные значения COUNT, если в обеих таблицах по 15 записей
Anonymous Quiz
37%
0 и 15
6%
1 и 15
42%
0 и 225
15%
15 и 225
🔥1
7️⃣ вопрос
Вопрос: укажите минимально и максимально возможные значения COUNT, если в обеих таблицах по 15 записей, все числа положительны, каждое из допустимых чисел встречается хотя бы раз (но не более двух)
Anonymous Quiz
58%
15 и 225
12%
9 и 225
18%
9 и 81
12%
20 и 225
🔥21