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

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

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
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
Немного истории

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

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

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

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

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

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

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
👍17
Инструкция создания БД 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
👍253🤩1
Земля вызывает базу

Ок. СУБД поставили, что дальше?
Надо бы как то начать управлять этим богатством. Какие есть варианты?

1️⃣ Командная утилита psql
Аналог sqlplus в мире Oracle.

Доступна в установленном контейнере. Подключиться можно командой:
docker exec -it mypgdb14 psql -U postgres

docker exec -it mypgdb14 - эта часть относится к docker
psql -U postgres - эта к утилите psql. -U к какому юзеру подключаемся.

2️⃣ IDE с человеческим интерфейсом
Их достаточное количество на любой вкус и цвет.
DBeaver, DataGrip, PgAdmin4 и другие.

На скрине показано окно настроек подключения в DBeaver.
▫️Server: localhost
▫️Dbname: postgres
▫️Port: 5434 (указывали при создании)
▫️User: postgres
▫️Pass: mypass (указывали при создании)

Ввели креды, протестировали. Все должно быть ок

Завтра продолжим 😉

#postgresql #ide
Oracle Developer
👍17🔥1
К серверу подключились. Что дальше?

Сервер БД (кластер) может содержать несколько БД. Близкая аналогия с Oracle - это набор PDB. По умолчанию создается БД postgres, а также шаблонная БД (template).

Можем создать БД владельцем, которой будет пользователь postgres. Мы пойдем другим путем. Создадим владельца будущей базы. А потом уже БД с указанием владельца.

1️⃣ Создаем пользователя:
create role mydb_owner login password 'mypass';
или
create user mydb_owner password 'mypass';

А причем тут роль? Да, в мире PG роль может быть как пользователем, так и ролью.
Юзер/роль создается общая на весь кластер.

2️⃣ Создаем отдельную БД
create database mydb owner mydb_owner;

БД создали. Где будем хранить объекты? В схеме.
В Oracle при создании пользователя, автоматически создается схема. В Pg это нужно делать отдельно. По умолчанию создается схема public.

3️⃣ Создаем схему
create schema my_schema;

Не обязательно использовать psql, достаточно использовать IDE 😇

Продолжение следует😉

#postgresql
Oracle Developer
👍24
Создаем объекты

Начнем с таблиц. Синтаксис PG чуть более богат чем Oracle (до 23й версии). Можем использовать if exists/not exists.

drop table if exists my_tab;

create table if not exists my_tab
(
id bigserial constraint my_tab_pk primary key,
d date not null,
t time not null,
note text
);

🔸 bigserial - большое целое с автоувеличением (похож на generated always as identity в Oracle);
🔸 date - только дата;
🔸 time - только время;
🔸 text - строка неограниченной переменной длины (рекомендован к применению; похож на clob в Oracle).

Добавим несколько строк:
insert into my_tab(d, t, note) values
(now(), now(), 'text 1'),
(now(), now(), 'text 2');

insert into my_tab values
(default, now(), now(), 'text 3'),
(default, now(), now(), 'text 4');

🔸 now() - аналог sysdate.
🔸 default - есть в Oracle.

Заметьте, как элегантно можно вставить N строк в одном операторе. Это будет представлено только в Oracle 23. На текущий момент, придется написать аж четыре команды.

#postgresql
Oracle Developer
👍22