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
Техническое собеседование в Тинькофф. Ответы

Список вопросов см. в посте вторника.

1️⃣ Секционирование
Одна из базовых тем для разработчика. Знать обязан каждый.
По тегу #секционирование можно найти несколько постов. Видов секционирования больше чем в этом посте. В 2021м я даже проводил обучение. Кстати, если наберется группа из 10 человек проведу еще. Кому интересно пишите в личку.

2️⃣ Индексы
🔹 про виды индексов было в посте на прошлой неделе.
🔹 как правильно выбирать столбцы: зависит от системы olt/dwh -> физической организации индекса B-tree, bitmap. Для B-tree важный критерий уникальность значений (дб максимальна), для bitmap - наоборот (пример, пол). + фишки с лидирующим столбцом. Как раз в курсе оптимизации будем разбирать.

3️⃣ Вопросы связанные с механизмом многоверсионности (UNDO)
🔹 помним, что измененные блоки/строки попадают в UNDO. При выполнении запроса - с UNDO выгребаются данные соответствующие определенным критериям.
🔹 два поста на классические ошибки - пост1, пост2 нужно понимать почему они возникают и как с ними бороться.

4️⃣ Блокировки
select for update + опции, dbms_lock, lock table, стратегии оптимистичная/пессимистичная, защелки в SGA.

5️⃣ Транзакции
вот прям по тегу #транзакции учим наизусть и этого хватит на все собеседования.

6️⃣ Многопоточность
Oracle это все же не Java. Тут нет такого многообразия механизмов. Все ограничивается набором из dbms_job, dbms_scheduler, dbms_parallel, хинт parallel.

7️⃣ Кэширование
Различные виды кэшей - кэши в SGA, #result_cache, #deterministic и самописные решения на основе коллекций + состояние пакета.

8️⃣ Оптимизация
Удивился когда обнаружил 37 постов по тегу #оптимизация В них есть частичный ответ на извечный вопрос “что делать, если запрос начал тормозить”. Опять же не рекламы ради скажу, что будем разбирать подробно это на курсе по оптимизации.

Пост получился длинноват. При том, что я не очень подробно ответил на все вопросы. Каждый можно знатно помусолить. Это, всего лишь, направления.

Не факт, что у вас будут те же вопросы 😉

Палец вверх, если зашло 👍
Обсудить в чатике 🫂

#решениезадачи #тинькофф #собеседование
Oracle Developer
👍471
Oracle + Тинькофф. Заключение

Заканчиваю эпопею с Тиньком.

Еще в 2018м году я прошел собеседование в Тинькофф банк. Тогда я выбирал между ним и Qiwi. Выбрал Qiwi ❤️

В этот раз я не получил оффер 😌
💬HR: "По техническим навыкам вопросов нет. Их смутили софты. Будет сложно влиться в команду, так как не увидели мотивации быть эффективным членом команды. На мотивацию они действительно обращают большое внимание."

Раскусили казачка засланного. Слишком самоуверенный и чутка нагловатый подход на собеседовании не идет на пользу кандидату 😂

Я не буду оценивать простоту или сложность прохождения всех этапов. Очень субъективно. С уверенностью можно сказать, на успех влияет сумма факторов: hard + soft skills. В вашей истории может быть совсем другой итог. Если вы мидл и не ответите на некоторые технические вопросы - это не значит, что вы не пройдете 😉 Пытайтесь.

Еще раз. Тем, чем предстоит заниматься - заманчиво🔥 Это отличный задел на развитие вас как специалиста-технаря (Oracle, Java-стек), так и руководителя в будущем. Тинькофф-банк достойный работодатель с возможностью работать удаленно в РФ и в некоторых странах ближнего зарубежья.

Если интересны реальные истории о прохождении собеседований, можете накинуть идей в чат куда еще стоит отправить резюме 😉

Всем хороших выходных!🌞

#тинькофф #собеседование
Oracle Developer
👍14🤯2
Друзья, всем привет!

30.11 у коллег закончилось трехмесячное путешествие по миру PL/SQL 🚀

Рад сообщить, о старте уже восьмого потока курса “Oracle PL/SQL.Основы” 🎓

Будет полезен: QA-инженерам, разработчикам, аналитикам.

Цель: научить вас читать чужой и писать свой PL/SQL-код, достаточный для современной разработки и закрытия рабочих задач.

🔹22 видео;
🔹18 практик = единый проект;
🔹13 онлайн встреч в Zoom с разбором вопросов;
🔹закрытый телеграм-канал;

Шаг за шагом, вы будете создавать API для прототипа платежной системы. Начав с анонимных блоков вы закончите своим фреймворком для Unit-тестирования. Пример.

Подробности и программа - здесь. Видео-отзывы - здесь.

Для тех кто заинтересован, но пока не уверен, я создал промо-группу курса, в которой буду размещать подробности, отрывки с занятий, отвечать на вопросы (да вы можете их сразу задавать) и даже встретимся онлайн. Залетайте!

⚠️ Группа 10 человек. Даты проведения: 13.01 - 31.03
Отличное время прокачаться 🎓

#plsql_basic
Oracle Developer
👍6🤩1
Задача. Ревью. Замена домена в email ✉️

Представьте, что вам на код-ревью junior отправил код процедуры (см ниже).

Функционал: замена домена в email’ах некой таблицы broker.
Предполагается, что объем измененных данных будет около 100К строк.

create or replace procedure change_domain(p_olddomainname varchar2
,p_newdomainname varchar2) is
cursor c_emailaddress is
select broker_number
,email_address
from broker
where lower(email_address) like '%@' || lower(p_olddomainname);

v_brokernumber broker.broker_number%type;
v_emailaddress broker.email_address%type;
v_localaddress broker.email_address%type;
v_atposition number(2, 0);
begin
open c_emailaddress;

loop
fetch c_emailaddress
into v_brokernumber
,v_emailaddress;

exit when c_emailaddress%notfound;

v_atposition := instr(v_emailaddress, '@');
v_localaddress := substr(v_emailaddress, 1, v_atposition);

update broker
set email_address = v_localaddress || p_newdomainname
where broker_number = v_brokernumber;

end loop;

close c_emailaddress;

end;
/

Пропустите ли вы такой код? Если нет, то почему? Есть ли в нем проблемы? Какие рекомендации дадите разработчику?

Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓

#задача
Oracle Developer
👍4
Решение. Ревью. Замена домена в email

Всем привет!
Постановка: в посте вторника.

Анализ
Сразу скажу, у меня такой код не прошел бы ревью. Объясню причины.

1️⃣ Работа с данными выполняется по одной строке, используя курсор.
fetch c_emailaddress into v_brokernumber, v_emailaddress;
ничего не мешает вычитывать данные пачками, с использованием конструкции limit.

2️⃣ Работая с пачками, для обновления таблицы broker, стоит использовать forall - оператор множественного связывания.

3️⃣ Код не закрывает корректно курсор, в случае возникновения исключений.
Обычно это выполняется через блок обработки ошибок в конце процедуры.
exception 
when others then
if c_emailaddress%isopen then
close c_emailaddress;
end if;
raise;
end;

Но это всё так… мелочи.

Главный вопрос - а зачем нам тут курсор и построчная обработка
С учетом объема строк (100К), одного обычного update вполне хватит, чтобы решить эту задачу. Обертка в виде процедуры - дело конкретной реализации.

create or replace procedure change_domain(p_olddomainname varchar2
,p_newdomainname varchar2) is
update broker
set email_address = ...
where lower(email_address) like '%@' || lower(p_olddomainname);

end;
/

Код получился очень простой и лаконичный.
В задаче не рассмотрен вопрос оптимизации выполнения запроса.

Простое правило: если вы пишете слово cursor в вашем коде, подумайте хорошенько “надо ли”, может можно сделать все проще 🤷‍♂️

Хотите научиться писать PL/SQL-код, за который не будет стыдно? Знать когда применять курсоры, а когда нет?
Новый набор на 8-й поток курса “Основы PL/SQL” уже начался. Старт занятий - 13 января 🎓

Палец вверх, если задача понравилась 👍 Обсудить в чатике.

#решениезадачи #cursor
Oracle Developer
👍17🔥1🎉1
Code-review процедуры "Перевод платежа в ошибку"

Всем привет!
Задача в формате код-ревью 👍

Джун отправил код. Процедура в пакете - перевод платежа в статус "ошибка".

Пропустите ли вы такой код? Если нет, то почему? Есть ли в нем проблемы? Какие рекомендации дадите разработчику?

procedure fail_payment(p_payment_id payment.payment_id%type
,p_reason payment.status_change_reason%type)
is
v_status payment.status%type;
e_status_is_not_active exception;
begin

select status
into v_status
from payment
where payment_id = p_payment_id;

if v_status != c_active then
raise e_status_is_not_active;
end if;

update payment
set status = c_error
,status_change_reason = p_reason
where payment_id = p_payment_id;

exception
when e_status_is_not_active then
raise_application_error(c_err_code_status_is_not_active, 'Платеж не активный');

when no_data_found then
raise_application_error(c_err_code_payment_is_not_found, 'Платеж не найден');
end;
/

Уточнения (на самом деле, не сильно влияет на анализ задачи):

1️⃣ Константы определены в спецификации:
c_active constant payment.status%type := 0; — платеж активный
c_error constant payment.status%type := 2; — платеж в ошибке

c_err_code_status_is_not_active constant number(10) := -20101;
c_err_code_payment_is_not_found constant number(10) := -20102;

2️⃣ Определение таблицы можно посмотреть здесь.

3️⃣ Многосессионная среда, есть конкуренция за данные.
——-
Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓

Для тех кто хочет подтянуться свои знания в PL/SQL, портал возможностей откроется с 13.01 - 8й поток курса Основы PL/SQL. Записывайтесь, пока еще, есть несколько мест 🔥

#задача
Oracle Developer
👍4
Пишем свой framework для Unit-тестирования на PL/SQL

Друзья всем привет!
Традиционно хотел вас порадовать перед новым годом.
Думал думал и родилась идея 💡

А что если взять прямо в онлайн в зум-конфе при вас написать небольшой фреймворк для организации Unit-тестирования? С нуля с объяснениями?
Заодно про принципы написания Unit-тестов рассказать?

Займет наша кодинг-сессия около часа.

Была бы интересная такая часовая туса в следующий понедельник (26.12) в 19:30(МСК)?

Если пост насобирает хотя бы 1️⃣0️⃣0️⃣ 👍 - проведу.

Обсудить в чатике.

Кстати, примерно тоже самое делают студенты у меня на курсе по PL/SQL. Кто еще думает - идти или нет. 100% идти 😁

——

UPD: Пост набрал 100 👍 - встрече быть 😉
Ссылку на Zoom скину в понедельник.

Oracle Developer
👍88
Code-review процедуры "Перевод платежа в ошибку". Анализ

Задача: см пост вторника

Анализ
С первого взгляда, код вполне себе невинен. Отрабатываются основные ситуации:
1️⃣ статус платежа не подходящий для изменений (if v_status != c_active then).
2️⃣ когда платежа нет (when no_data_found then);

Однако в обработке каждой ситуации заложена архитектурная ошибка 🤷‍♂️

1️⃣ Проверка статуса

БД, в принципе, многосессионная среда. Это API для работы с отдельной сущностью. Подобные обертки в основном реализуются не в DWH, в котором работа с данными выполняется в чуть более свободном режиме.
Соответственно, могут возникать ситуации, когда с одной и той же сущностью работают более чем 1 сессия. Могут возникать race condition.
Если совсем на пальцах: между тем, когда мы считали статус платежа (select status) и тем, когда мы совершаем update payment, статус мог измениться. В многосессионной среде так и будет. Разруливаются подобные проблемы - блокировками.

Первый вариант: добавить for update с опциями, которые соответствуют бизнес-задаче.
select status …  for update с опциями;

Второй вариант: проверять в update статус. Если строка заблокирована, то выполнение повиснет до освобождения блокировки.

2️⃣ Обработка отсутствия платежа.

В текущей реализации - это бомба замедленного действия. Как правильно заметили в комментариях, рано или поздно будет добавлен еще один select и общий NO_DATA_FOUND на весь блок будет отрабатывать не только отсутствие платежа, но и другие запросы.
Как надо бы сделать - обернуть select, возбудить в нем пользовательское исключение и уже в общем блоке его обработать.

begin
select …
exception
when no_data_found then
raise e_payment_not_found;
end;

Итог: код не прошел code review.


Продолжая тему: лучше выделить функционал в отдельную процедуру типа try_lock_payment, в которой блокировать платеж, проверять его state и наличие. Т.к. api-процедур по работе с платежом более чем одна.

Подобный код пишут студенты на курсе Основы PL/SQL, в котором мы разбираем не только синтаксис и объекты, но и архитектурные принципы построения API. Старт - 12.01. Записывайтесь, пока еще, есть несколько мест 🔥

#решениезадачи #блокировки #исключения
Oracle Developer
👍9🔥1
Сегодня пятница и немного баянного юмора не помешает😉

Всем хороших выходных 🎊

Перетереть в чатике 💬

#юмор
Oracle Developer
🔥17👍3🎉2
Пишем свой framework для Unit-тестирования на PL/SQL

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

В прошлую среду анонсировал встречу или, как модно говорить, вебинар на тему “Пишем свой framework для Unit-тестирования на PL/SQL”. Исходя из количества лайков, понимаю, что тема интересна.

Что обсудим?
- что такое тестирование;
- что такое unit-тестирование;
- пример написания теста в общем;
- напишем свой простенький фреймворк для Unit-тестирования с нуля;
- чуть затронем фреймворк utPL/SQL;
- отвечу на вопросы, в том числе по курсу Основы PL/SQL.

Продолжительность: 1-1.5 часа как пойдет.

Начало вебинара: 19:30 МСК сегодня.

Подключиться можно будет по зум. Данные для подключения:
https://qiwi.zoom.us/j/99405211225?pwd=eU9YaFpEVjRaYUloTnYxZ2VxWWZXQT09
Идентификатор конференции: 994 0521 1225
Код доступа: 724031

Будет ли запись? Будет.

До встречи ✌🏻

#webinar #видео #подкаст
Oracle Developer
🔥21👍3
Коллеги, всем спасибо за участие!

Получилось долго, но надеюсь продуктивно 😉
Запись вебинара обязательно залью.

Пожалуйста, дайте обратную связь, мне это важно 🤝

Материалы
🔹 презентация по Unit-тестам
🔹 код с объектам и примером юнит-тестов
🔸 п
ромо-страница курса Oracle PL/SQL
🔸 отзывы студентов об обучении
🔸 написать мне в личку
👍52
Ribbon vs Classic Menu в PL/SQL Developer

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

Иногда замечаю у коллег, студентов огромное меню панели инструментов в PL/SQL Developer’e. Ввели его с 10й что ли версии.
На мой взгляд, занимает пол экрана. Полезная площадь бесполезно расходуется 😱

Переключиться на классическое компактное меню можно в настройках.
Configure -> Preferences -> Appearance -> мотаем до конца окна и выбираем Switch to Menu.

💡 Больше места - больше пространства для кода - удобней работать.

#ide
Oracle Developer
👍31🔥6👎2🤩1
Standard SQL Functions Cheat Sheet

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

Случайно попалась шпаргалка по SQL. На мой взгляд, довольно концентрированная информация с графическими иллюстрациями. Для junior, middle, вполне себе, отличное подспорье.

Шпаргалочка не совсем прям 100% про Oracle. С ходу нашел некоторые отличия.
🔹 тип Date не хранит время (в Oracle хранит);
🔹 наличие - Named Window Definition (в Oracle отсутствует).
🔹 возможно, что-то еще.
Можем устроить мини-соревнование в чатике - "кто найдет больше всего несоответствий между SQL и Oracle SQL" 😁

Сохраняйте, отправляйте коллегам 😉

Oracle Developer
👍14🔥1
Друзья, всем привет!

На прошлой недели, для канала, проходил собес в одну из компаний. Позже расскажу - что куда и как😉

Помимо всех прочих вопросов про оптимизацию, секционирование, кэширование и архитектуру построения приложений были вопросы про коллекции и курсоры.

💬 Интервьювер: какой best-practice по применению курсоров? Какие виды коллекций и кейсы применения? Как передавать данные между разными модулями и слоями приложения?

Что вы ответите? Если в голове возникает сумбурная картинка, то не удивляйтесь, что собеседование вы можете не пройти

Однако, это "база". Эти темы мы проходим в курсе основы PL/SQL, разбираем множество примеров с коллекциями и курсорами, применяем их на практике.
У кого до сих пор в голове путница, я рекомендую посетить 3х месячный курс по PL/SQL.

Даже те ребята, которые программируют не первый год, находят для себя много нового 😉
Помимо синтаксиса мы еще затрагиваем темы:
🔹 чистый код, именования, форматирование;
🔹best-практисы в компаниях;
🔹архитектуру приложений и многие другие.

С 12.01 по 31.03 пройдет очередной поток. Места еще есть, но их немного. Продажи закроются 23:59 31.12.
В любые времена вложения в свое здоровье и образование было отличной идеей 👌
Время тикает, не упустите шанс 😉🔥

PS. Кстати, если будет желание при отличной успеваемости смогу рекомендовать вас HR из Qiwi, кто знает, вдруг вы станете частью Qiwi-семьи 😉

Ссылки
🔸 Промо-страница курса
🔸 Оплатить участие в курсе
🔸 Оплатить участие в курсе (в рассрочку)
🔸 Три урока бесплатно
🔸 Плей-лист с демо-уроками
👍8
Друзья всем привет!

Это уже третий новый год, с которым я поздравляю вас в нашем канале 🥳

Что сказать про уходящий 22й? Вы и без меня все знаете… Лично мои планы на обучающие программы были полностью нарушены. Новых видео на канале практически не было. Предыдущие года были более продуктивными с точки зрения контента. Как-то не располагала обстановка к творчеству 🤦🏻‍♂️

Конечно, хочется, чтобы 2023 был другим. Более позитивным и эффективным.
Моя главная задача на следующий год - добить курс по Основам оптимизации SQL. Половина уже написана, половина осталась. Надеюсь сделаю, если опять не случится какая-нибудь непредвиденная дичь.
Плюс, пилить контент для вас, мои дорогие 😁 Спасибо, что остаетесь на канале 🤝

От себя хочу пожелать - здоровья, счастья и успехов во всех делах, развиваться, быть здоровой клеткой. Берегите себя и своих близких. Мирного неба над головой 🕊

С наступающим 2️⃣0️⃣2️⃣3️⃣ годом! 🎄

Создатель канала Oracle Developer, Кивилёв Денис
👍45🎉1210🔥3
Видео с вебинара

Друзья всем привет!
Ну что? как вам в 2023м? 😁

К сожалению, в конце прошлого года я приболел и не успел выложить видео с вебинара “Пишем свой framework для Unit-тестирования на PL/SQL”.
Выполняю обещание.

Вебинар вместо одного часа получился аж на два.
🔸30 минут ушло на теорию тестирования и примеры;
🔸1 час на написание простенького фреймворка для тестирования;
🔸остальное на различные вопросы-ответы, в том числе про сертификацию и курс PL/SQL.
В видео есть тайминги, поэтому будет проще ориентироваться.

Спасибо кто оставил обратную связь 👍 подкинули некоторые темы на будущие вебинары.

Пользуясь случаем, скажу, что осталось 1️⃣ место на поток по Oracle PL/SQL, который стартанет 12.01. Если хотите попасть - пишите мне в личку.

Всем приятного просмотра 🎥

#webinar #видео #подкаст #utplsql #тестирование
Oracle Developer
👍12🔥1
Инструкция создания Oracle XE в Docker

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

Установка Oracle на ваш ПК (не сервер) с дистрибутива это уже совсем позавчерашний день.
Современная парадигма - контейнеризация. Docker - один из представителей.
Можно развернуть что угодно в контейнере, не затрагивая вашу главную ОС.

Я уже делал видосы по установке Oracle в Docker (раз, два, три). К сожалению, для тех кто с РФ эти способы немного устарели.

Предлагаю красивую альтернативу. Развертывание происходит гораздо быстрей и нет проблем со скачиванием дистрибутива с официального сайта.

Готовые собранные контейнеры - https://hub.docker.com/r/gvenzl/oracle-xe

Они же используются для тестирования с использованием testcontainers (джавистам на заметку).

Доступны - 11, 18, 21 версии. Начиная с 18й версии редакция XE обладает всеми опциями, что и Enterprise Edition (EE). Так что её хватит сполна.

Продолжение ⬇️
👍61
Краткая инструкция (для Windows):
1️⃣ Устанавливаете Docker в вашу ОС.
https://docs.docker.com/desktop/install/windows-install/

2️⃣ Скачиваете image с нужной версией Oracle.
Версию выбираете на страничке проекта.
Выполняете в командной строке:
docker pull gvenzl/oracle-xe:21.3.0

Скорость скачивания зависит от вашего интернета.

3️⃣ Создаете контейнер из image с указанием параметров
Например:
docker run --name oradb21xe -d -p 1523:1521 -e ORACLE_PASSWORD=booble34 gvenzl/oracle-xe:21.3.0

имя контейнера oradb21xe, порт доступа - 1523, пароль для sys/system - booble34

Контейнер создастся практически мгновенно.

4️⃣ Скачиваете Oracle client и настраиваете network\admin\tnsnames.ora
Добавляете в него алиас на новую БД.
oradb21xe =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1523))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xepdb1)
)
)

Всё 🔥

Внутрь контейнера можно попасть через
docker exec -it oradb21xe /bin/bash

К БД можно подключиться
sqlplus system/booble34@oradb21xe 

Для Mac/*nix почти тоже самое.

PS. Параметров создания БД гораздо больше, можно настроить очень гибко.
По умолчанию, удаленное подключение (не с сервера) к SYS + пароль не доступно (не важно как вы устанавливаете БД). Для настройки нужно выполнять доп. приседания.

Обсудить в чатике 💬

#docker #oraclexe
Oracle Developer
👍311
Друзья всем привет!

Объявляю эту неделю - неделей знакомства с PostgreSQL. Одной из главных альтернатив Oracle на международном и российском рынке, в частности. Ведь PostgreSQL версии Pro прошла сертификацию ФСТЭК и внесена в реестр отечественного ПО.

Рано или поздно вы столкнетесь с этой СУБД, если еще не.

продолжение ⬇️
👍15🔥2