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

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

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
Oracle + Тинькофф. Заключение

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

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

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

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

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

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

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

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

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

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
Задача. Ревью. Замена домена в 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
Решение. Ревью. Замена домена в 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
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
Пишем свой framework для Unit-тестирования на PL/SQL

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

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

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

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

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

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

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

——

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

Oracle Developer
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
Сегодня пятница и немного баянного юмора не помешает😉

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

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

#юмор
Oracle Developer
Пишем свой 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
Коллеги, всем спасибо за участие!

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

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

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

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

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

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

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

#ide
Oracle Developer
Standard SQL Functions Cheat Sheet

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создатель канала Oracle Developer, Кивилёв Денис
Видео с вебинара

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Продолжение ⬇️
Краткая инструкция (для 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
Друзья всем привет!

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

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

продолжение ⬇️
Немного истории

PostgreSQL был создан в 1986 году в Университете Массачусетса в Бостоне. Он вырос из проекта POSTGRES, который затем был переименован в СУБД PostgreSQL.
В начале 1990-х годов PostgreSQL стал открытым исходным программным обеспечением. С тех пор PostgreSQL набрала значительную популярность среди СУБД. Достаточно взглянуть на тренды.
Одним из главных контрибьютеров открытого комьюнити был и есть Олег Бартунов 🇷🇺. Олег часто участвует в конференциях, на Youtube есть множество докладов.

В 2015 году он и его коллеги стали развивать платную версию - Postgres Pro (Professional), которая имеет дополнительные фишки (автономные транзакции, секционирование из коробки и др), а также тех поддержку.
Да, эта та самая СУБД в реестре отечественного ПО.

Их же компания пишет отличную документацию на русском и создает обучающие курсы.

Фишки из платных версий Pg постепенно перетекают в бесплатную версию.

продолжение ⬇️

#postgresql
Oracle Developer
Возможности СУБД

PostgreSQL это мощная объектно-реляционная СУБД, которая предлагает широкий спектр функциональности, включая:

1️⃣ Поддержка ACID (Atomicity, Consistency, Isolation, Durability) транзакций для обеспечения целостности данных.

2️⃣ Поддержка хранения и управления данными в различных форматах, таких как JSON, XML и др.

3️⃣ Расширенные возможности аналитики и агрегации, включая поддержку оконных функций, группирования и анализа данных.

4️⃣ Репликация и высокая доступность, включая поддержку резервного копирования, асинхронной репликации и репликации с нескольких источников.

5️⃣ Механизмы управления безопасностью, включая поддержку ролей, прав доступа и контроля доступа к данным.

6️⃣ Расширенные возможности индексирования и оптимизации запросов, включая поддержку различных типов индексов, таких как B-Tree, Hash, GIN и др.

7️⃣ Поддержку языков программирования и расширений, таких как PL/pgSQL, PL/Tcl, PL/Perl и др.

8️⃣ Открытый исходный код и активную комьюнити, которая разрабатывает и улучшает функциональность.

9️⃣ Огромные возможности для расширения функциональности с помощью сторонних модулей и плагинов.

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

Конечно, в любом ПО есть свои плюсы и минусы.
—-

Завтра я расскажу, как можно развернуть PG локально в пару команд 😉

#postgresql
Oracle Developer
Инструкция создания БД PostgreSQL в Docker

Создание БД в Docker - отличный способ быстро приступить к экспериментам. Процесс элементарный.

1️⃣ Устанавливаем Docker на вашу ОС
Win Mac Linux

2️⃣ Запускаем контейнер с 14-й версией
docker run -p 5434:5432 --name mypgdb14 -e POSTGRES_PASSWORD=mypass -d postgres:14

mypgdb14 - название pg-кластера
mypass - пароль
5434:5432 - проброс стандартного порта на 5434
postgres:14 - версия Pg

Если у вас еще нет образа (image) c postgres:14, то он будет скачан. Время запуска зависит от вашей скорости интернета. Последующие создания контейнеров будут занимать пару секунд.

3️⃣ Проверяем, что контейнер запущен
docker ps

4️⃣ Подключаемся к консоли
docker exec -it mypgdb14 psql -U postgres

Всё, теперь можно эксплуатировать контейнер в хвост и гриву.

⚠️ СУБД поднимается в самой минимальной конфигурации.

Продолжение завтра 😉

#docker #postgresql
Oracle Developer