🎵 «Во поле берёза стояла
Во поле кудрявая стояла
Люли-люли, стояла
Люли-люли, стояла» — народная 🌳✨
📌 Разбор задачи: Зеркальное отображение дерева
🧩 Условие:
Дана бинарная береза 🌲.
Преобразуйте бинарное дерево в его зеркальное отображение — то есть поменять местами все левые и правые поддеревья.
⚙️ Алгоритм (кратко):
Рекурсивно обходим дерево.
Для каждой вершины:
🔄 меняем местами левое и правое поддерево.
Возвращаем новую ссылку на корень.
💻 Решение (PL/SQL):
👍 Пальцы вверх — продолжаем разбирать задачи методами процедурного языка.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
Вчера комменты были интереснее поста, надуюсь что "есть еще порох в пороховницах"👇
#️⃣ #SQL #Oracle #PLSQL
Во поле кудрявая стояла
Люли-люли, стояла
Люли-люли, стояла» — народная 🌳✨
📌 Разбор задачи: Зеркальное отображение дерева
🧩 Условие:
Дана бинарная береза 🌲.
Преобразуйте бинарное дерево в его зеркальное отображение — то есть поменять местами все левые и правые поддеревья.
⚙️ Алгоритм (кратко):
Рекурсивно обходим дерево.
Для каждой вершины:
🔄 меняем местами левое и правое поддерево.
Возвращаем новую ссылку на корень.
💻 Решение (PL/SQL):
CREATE OR REPLACE TYPE node IS OBJECT (
value NUMBER,
left REF node,
right REF node
);
CREATE TABLE nodes OF node;
DECLARE
TYPE ref_tab IS TABLE OF REF node INDEX BY PLS_INTEGER;
refs ref_tab := ref_tab();
root REF node;
mirroredTreeRoot REF node;
PROCEDURE insert_node (root IN OUT REF node, new_value IN NUMBER) IS
current node;
BEGIN
IF root IS NULL THEN
INSERT INTO nodes n
VALUES (node(VALUE => insert_node.new_value, left => NULL, right => NULL))
RETURNING REF(n) INTO insert_node.root;
ELSE
SELECT DEREF(root) INTO current FROM DUAL;
IF new_value < current.VALUE THEN
insert_node(root => current.left, new_value => new_value);
UPDATE nodes n SET n.left = current.left WHERE REF(n) = insert_node.root;
ELSE
insert_node(root => current.right, new_value => new_value);
UPDATE nodes n SET n.right = current.right WHERE REF(n) = insert_node.root;
END IF;
END IF;
END insert_node;
PROCEDURE print_node (root IN OUT REF node) IS
current node;
skip EXCEPTION;
BEGIN
IF root IS NULL THEN RAISE skip; END IF;
SELECT DEREF(root) INTO current FROM DUAL;
DBMS_OUTPUT.put_line(
'node(' || TO_CHAR(current.VALUE)
|| ',' || CASE WHEN current.left IS NOT NULL THEN 'left=yes' ELSE 'left=no' END
|| ',' || CASE WHEN current.right IS NOT NULL THEN 'right=yes' ELSE 'right=no' END
|| ')'
);
IF current.left IS NOT NULL THEN print_node(root => current.left); END IF;
IF current.right IS NOT NULL THEN print_node(root => current.right); END IF;
EXCEPTION WHEN skip THEN NULL;
END print_node;
FUNCTION mirror_tree (root REF node) RETURN REF node IS
newNode REF node;
BEGIN
IF root IS NULL THEN RETURN NULL; END IF;
DECLARE
current node;
leftNext REF node;
rightNext REF node;
BEGIN
SELECT DEREF(root) INTO current FROM DUAL;
leftNext := mirror_tree(root => current.right);
rightNext := mirror_tree(root => current.left);
INSERT INTO nodes n
VALUES (node(VALUE => current.VALUE, left => leftNext, right => rightNext))
RETURNING REF(n) INTO newNode;
RETURN newNode;
END;
END mirror_tree;
BEGIN
FOR i IN 1..10 LOOP
DECLARE newValue NUMBER := TRUNC(DBMS_RANDOM.VALUE(1, 100));
BEGIN insert_node(root => root, new_value => newValue); END;
END LOOP;
DBMS_OUTPUT.put_line('root');
print_node(root => root);
mirroredTreeRoot := mirror_tree(root);
DBMS_OUTPUT.put_line('mirroredTreeRoot');
print_node(root => mirroredTreeRoot);
END;
👍 Пальцы вверх — продолжаем разбирать задачи методами процедурного языка.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
Вчера комменты были интереснее поста, надуюсь что "есть еще порох в пороховницах"👇
#️⃣ #SQL #Oracle #PLSQL
👍13👎4
🎵 «Киборг-убийца рвётся наружу,
Он не опасен, он безоружен.
Киборг-убийца на вечеринке,
Любит Анжелу, любит Маринку.
Киборг-убийца где-то внутри —
Может быть, я, может быть, ты…» — Ленинград 🤖🎤
📌 Разбор задачи: Путь робота в сетке
🧩 Условие:
Робот начинает движение в верхнем левом углу сетки m × n.
Он может двигаться только 👉 вправо или 👇 вниз.
Нужно найти количество уникальных путей до нижнего правого угла.
⚙️ Алгоритм (кратко):
1️⃣ Создаём матрицу n × m.
2️⃣ Заполняем первую строку и первый столбец единицами (робот может двигаться только по одной траектории).
3️⃣ Для каждой ячейки:
📐 matrix[i][j] = matrix[i-1][j] + matrix[i][j-1]
(сумма способов попасть сверху и слева).
4️⃣ В правом нижнем углу будет количество всех уникальных путей.
💻 Решение (PL/SQL):
📊 Для сетки 10 × 10 ответ будет: 48620 уникальных путей.
✨ Можно усложнить задачу: сделать матрицу бинарной (1 и 0), и добавить условие, что робот может двигаться только по клеткам со значением 1.
💡 Желающие могут поэкспериментировать и поделиться своими решениями в комментах.
👍 Пальцы вверх — продолжаем разбирать задачи методами процедурного языка.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
💬 Каждый ваш коммент ценен, не сдерживайте себя — здесь цензуры нет 👇
#️⃣ #SQL #Oracle #PLSQL
Он не опасен, он безоружен.
Киборг-убийца на вечеринке,
Любит Анжелу, любит Маринку.
Киборг-убийца где-то внутри —
Может быть, я, может быть, ты…» — Ленинград 🤖🎤
📌 Разбор задачи: Путь робота в сетке
🧩 Условие:
Робот начинает движение в верхнем левом углу сетки m × n.
Он может двигаться только 👉 вправо или 👇 вниз.
Нужно найти количество уникальных путей до нижнего правого угла.
⚙️ Алгоритм (кратко):
1️⃣ Создаём матрицу n × m.
2️⃣ Заполняем первую строку и первый столбец единицами (робот может двигаться только по одной траектории).
3️⃣ Для каждой ячейки:
📐 matrix[i][j] = matrix[i-1][j] + matrix[i][j-1]
(сумма способов попасть сверху и слева).
4️⃣ В правом нижнем углу будет количество всех уникальных путей.
💻 Решение (PL/SQL):
DECLARE
TYPE row_tab IS TABLE OF NUMBER;
TYPE matrix_tab IS TABLE OF row_tab;
matrix matrix_tab := matrix_tab();
uniqueWayCount INTEGER;
PROCEDURE get_unique_way_count (
n IN INTEGER,
m IN INTEGER,
matrix IN OUT NOCOPY matrix_tab,
unique_way_count OUT INTEGER
) IS
PROCEDURE init_matrix (
n IN INTEGER,
m IN INTEGER,
matrix IN OUT NOCOPY matrix_tab
) IS
"row" row_tab := row_tab();
BEGIN
"row".extend(m);
matrix.extend(n);
FOR i IN 1..n LOOP
matrix(i) := "row";
END LOOP;
"row".delete;
END init_matrix;
BEGIN
init_matrix(n => n, m => m, matrix => matrix);
FOR i IN 1..n LOOP
FOR j IN 1..m LOOP
IF i = 1 OR j = 1 THEN
matrix(i)(j) := 1;
ELSE
matrix(i)(j) := matrix(i - 1)(j) + matrix(i)(j - 1);
END IF;
END LOOP;
END LOOP;
unique_way_count := matrix(n)(m);
END get_unique_way_count;
PROCEDURE print_matrix (matrix IN matrix_tab) IS
BEGIN
FOR i IN 1..matrix.COUNT LOOP
DECLARE
str VARCHAR2(200);
BEGIN
FOR j IN 1..matrix(i).COUNT LOOP
str := str || ' ' || TO_CHAR(matrix(i)(j));
END LOOP;
DBMS_OUTPUT.put_line(str);
END;
END LOOP;
END print_matrix;
BEGIN
get_unique_way_count(n => 10, m => 10, matrix => matrix, unique_way_count => uniqueWayCount);
print_matrix(matrix => matrix);
DBMS_OUTPUT.put_line('uniqueWayCount = ' || TO_CHAR(uniqueWayCount));
END;
📊 Для сетки 10 × 10 ответ будет: 48620 уникальных путей.
✨ Можно усложнить задачу: сделать матрицу бинарной (1 и 0), и добавить условие, что робот может двигаться только по клеткам со значением 1.
💡 Желающие могут поэкспериментировать и поделиться своими решениями в комментах.
👍 Пальцы вверх — продолжаем разбирать задачи методами процедурного языка.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
💬 Каждый ваш коммент ценен, не сдерживайте себя — здесь цензуры нет 👇
#️⃣ #SQL #Oracle #PLSQL
👍6👎5
🚀 Хочется прокачать SQL, но под рукой нет базы данных?
Рекомендую дружественный ресурс от моего коллеги Славы Рожнева - автора курса SQL от Яндекс практикума.
У Славы Рожнева — есть два удобных инструмента:
🔹 sqltest.online — тренажёр с задачами и тестами для практики.
📢 Канал: t.me/sqltestonline
🔹 sqlize.online — онлайн-песочница для SQL-запросов прямо в браузере.
📢 Канал: t.me/sqlize
✨ Отличный способ учиться и поддерживать навыки в любой момент и в любом месте.
Рекомендую дружественный ресурс от моего коллеги Славы Рожнева - автора курса SQL от Яндекс практикума.
У Славы Рожнева — есть два удобных инструмента:
🔹 sqltest.online — тренажёр с задачами и тестами для практики.
📢 Канал: t.me/sqltestonline
🔹 sqlize.online — онлайн-песочница для SQL-запросов прямо в браузере.
📢 Канал: t.me/sqlize
✨ Отличный способ учиться и поддерживать навыки в любой момент и в любом месте.
Telegram
SQLTest.online
Новости проекта SQLTest.online
👍11🤡3👎1🔥1
🎵 «Для меня деньги — бумага
Для тебя — свобода
На американскую мечту сегодня мода
К этой мечте стремишься ты
Работать роботом ради бумажной мечты» — Ленинград 🎸
📌 Задача из собеса в ЦБ (2020 год).
В самом первом посту канала (в прикреплённом файлике) — 3 задачи.
🔹 Первые две уже разобраны.
🔹 Вот третья:
🧩 Условие задачи:
Запрос формирует список действующих на sysdate ОКВЭД для всех организаций.
❗ При выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.
💡 Примечание:
Структуру таблиц T1, T2, T_okved приводить не нужно — она условная, нужна только для понимания сути.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
📝 В комментариях пишите свои мысли и варианты оптимизации ⚡
👇👇
#RealInterviewTasks #SQL #Oracle #PLSQL
Для тебя — свобода
На американскую мечту сегодня мода
К этой мечте стремишься ты
Работать роботом ради бумажной мечты» — Ленинград 🎸
📌 Задача из собеса в ЦБ (2020 год).
В самом первом посту канала (в прикреплённом файлике) — 3 задачи.
🔹 Первые две уже разобраны.
🔹 Вот третья:
🧩 Условие задачи:
Запрос формирует список действующих на sysdate ОКВЭД для всех организаций.
❗ При выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.
SQL
select
t1.ogrn,
t2.ds,
t2.de,
o.kod,
o.name,
o.ver
from T2
join T1 on t1.id = t2.id
left join T_okved o on o.id = t2.okved_id
where sysdate between t1.ds and t1.de
and sysdate between t2.ds and t2.de;
💡 Примечание:
Структуру таблиц T1, T2, T_okved приводить не нужно — она условная, нужна только для понимания сути.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
📝 В комментариях пишите свои мысли и варианты оптимизации ⚡
👇👇
#RealInterviewTasks #SQL #Oracle #PLSQL
👍5💩5❤2👎1
Продолжим или закончим 3 часть "Мерлезонского балета" - решение задач методами процедурного языка. Я выбрал очередные 5 задач из 5 тем: работа с массивами, работа со строками, работа с матрицами, структуры данных, динамическое программирование.
Anonymous Poll
9%
Перемещение нулей: все нули в конец массива, порядок ненулевых элементов сохраняется.
3%
Самая длинная подстрока: Найдите длину самой длинной подстроки без повторяющихся символов.
9%
Транспонирование: Транспонируйте заданную матрицу.
9%
Цикл в списке: Определите, содержит ли связный список цикл.
3%
Вычислите мин. кол-во операций (вставка, удаление, замена) нужных для преоб-ия одной строки в другую
26%
Я разработчик DB. Эти трюки для прикладников.
43%
Интересны все.
🤡6❤1👎1
DB developers channel
🎵 «Для меня деньги — бумага Для тебя — свобода На американскую мечту сегодня мода К этой мечте стремишься ты Работать роботом ради бумажной мечты» — Ленинград 🎸 📌 Задача из собеса в ЦБ (2020 год). В самом первом посту канала (в прикреплённом файлике) — 3…
📌 Разбор задачи из ЦБ (2020 год)
❗ Проблема: при выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.
💡 Решение
Основная причина переполнения TEMP — использование hash join, который строит большие промежуточные таблицы.
Чтобы этого избежать, можно подсказать оптимизатору использовать nested loop.
🔹 Оптимизированный запрос:
⚡ Идея решения:
USE_NL → переключаем соединение на nested loop, чтобы уменьшить нагрузку на TEMP.
Таким образом, запрос выполнится без переполнения TEMP.
UPDATES: под справедливой критикой коллег, запрос и пост изменил
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
📝 Как Вы бы решили?👇
#️⃣ #RealInterviewTasks #SQL #Oracle #PLSQL
select
t1.ogrn,
t2.ds,
t2.de,
o.kod,
o.name,
o.ver
from T2
join T1 on t1.id = t2.id
left join T_okved o on o.id = t2.okved_id
where sysdate between t1.ds and t1.de
and sysdate between t2.ds and t2.de;
❗ Проблема: при выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.
💡 Решение
Основная причина переполнения TEMP — использование hash join, который строит большие промежуточные таблицы.
Чтобы этого избежать, можно подсказать оптимизатору использовать nested loop.
🔹 Оптимизированный запрос:
SELECT --+ LEADING(T1 T2 o) USE_NL(T2 o)
t1.OGRN,
t2.DS,
t2.DE,
o.KOD,
o.NAME,
o.VER
FROM T1
JOIN T2 on (t1.id = t2.id)
left join T_okved o on o.id = t2.okved_id
WHERE sysdate between t1.ds and t1.de
and sysdate between t2.ds and t2.de;
⚡ Идея решения:
USE_NL → переключаем соединение на nested loop, чтобы уменьшить нагрузку на TEMP.
Таким образом, запрос выполнится без переполнения TEMP.
UPDATES: под справедливой критикой коллег, запрос и пост изменил
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
📝 Как Вы бы решили?👇
#️⃣ #RealInterviewTasks #SQL #Oracle #PLSQL
🤡5👍3👎1
✨ «Мы почитаем всех нулями,
А единицами — себя» - А.С. Пушкин
📌 Разбор задачи: Перемещение нулей
🧩 Условие:
Дан массив чисел. Нужно переместить все нули в его конец, сохраняя относительный порядок ненулевых элементов.
⚙️ Алгоритм (кратко):
1️⃣ Создаём новый массив той же длины.
2️⃣ Ведём два указателя:
🔹 firstNotNullIndex — куда класть ненулевые элементы.
🔹 lastNullIndex — куда класть нули с конца.
3️⃣ Проходим по массиву:
👉 если элемент ненулевой — кладём его в начало.
👉 если элемент равен нулю — отправляем его в конец.
💻 Решение (PL/SQL):
📊 Для массива:
👉 результат будет:
👍 Пальцы вверх — продолжаем разбирать алгоритмы на PL/SQL.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
💬 Есть что сказать!? Не сдерживаете себя 👇
#️⃣ #SQL #Oracle #PLSQL
А единицами — себя» - А.С. Пушкин
📌 Разбор задачи: Перемещение нулей
🧩 Условие:
Дан массив чисел. Нужно переместить все нули в его конец, сохраняя относительный порядок ненулевых элементов.
⚙️ Алгоритм (кратко):
1️⃣ Создаём новый массив той же длины.
2️⃣ Ведём два указателя:
🔹 firstNotNullIndex — куда класть ненулевые элементы.
🔹 lastNullIndex — куда класть нули с конца.
3️⃣ Проходим по массиву:
👉 если элемент ненулевой — кладём его в начало.
👉 если элемент равен нулю — отправляем его в конец.
💻 Решение (PL/SQL):
DECLARE
TYPE set_tab IS TABLE OF NUMBER;
"set" set_tab := set_tab(0,1,0,0,2,3,4,0,0,5,6,7,8,0,9,0);
newSet set_tab := set_tab ();
firstNotNullIndex INTEGER := 1;
lastNullIndex INTEGER := "set".COUNT;
BEGIN
newSet.extend("set".COUNT);
FOR i IN 1.."set".COUNT LOOP
IF "set"(i) = 0 THEN
newSet(lastNullIndex) := 0;
lastNullIndex := lastNullIndex - 1;
ELSE
newSet(firstNotNullIndex) := "set"(i);
firstNotNullIndex := firstNotNullIndex + 1;
END IF;
END LOOP;
<<print_set>>
DECLARE
str VARCHAR2(100);
BEGIN
FOR i IN 1..newSet.COUNT LOOP
str := str || TO_CHAR(newSet(i));
END LOOP;
DBMS_OUTPUT.put_line(str);
END;
END;
📊 Для массива:
0,1,0,0,2,3,4,0,0,5,6,7,8,0,9,0
👉 результат будет:
1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0
👍 Пальцы вверх — продолжаем разбирать алгоритмы на PL/SQL.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
💬 Есть что сказать!? Не сдерживаете себя 👇
#️⃣ #SQL #Oracle #PLSQL
👍13🤡6👎1
✨ «Сидит Кай, раскладывает льдинки.
Изо всех комбинаций вместо „Вечность“ снова выходит „ЖОПА“.
Герда смотрит и говорит:
— Кай, да у тебя просто талант программиста!» – анекдот 😅
🏛 Продолжаем тему: Архитектура кода
Наконец, я собрался с силами и написал несколько букв «правильного» кода, демонстрирующего подход к архитектуре 🚀
📌 Сразу оговорюсь: код упрощён и создан для демонстрации.
Многие вещи в реальности делаются сложнее и эффективнее, но нельзя объять необъятное в одном посте.
Тут важна не конкретика, как именно манипулировать данными пользователей (сам код для этого не годится), а как универсальный архитектурный принцип 🧩
Я специально оставил несколько «жуков» 🐞 — внимательный глаз их заметит 👀
Для опытного разработчика хватит пары дней на разбор.
Новичку, думаю, и месяца может быть мало ⏳
Это Вам не курсы проходить и книжки читать!!!
Это результат коллективного труда, моя доля в нём не велика,
но я считаю, что такая архитектура оптимальна ⚡
🔹 Краткое описание:
1️⃣ Таблицы:
users — основные поля пользователей
users_live — расчётные поля
2️⃣ Пакеты для хранения констант:
GLOBAL_CONSTANTS — глобальные константы
USERS_CONSTANTS — константы для работы с пользователями
3️⃣ Пакеты для работы с одной строкой:
USERS_LIB — методы уровня таблицы users
USERS_LIVE_LIB — методы уровня таблицы users_live
4️⃣ Пакеты бизнес-уровня:
AUTH_LVL1_PROC — установка контекста
USERS_LVL1_PROC — операции над пользователями
USERS_LVL2_PROC — парсинг входящих данных (XML/JSON)
5️⃣ API-уровень:
APPLICATION_API — методы для вызова пользователем
APPLICATION_SRV — методы для джобов/сервисов без контекста
⚠️ Обратите внимание:
1.В коде нет операторов управления транзакциями. Он пассивен.
COMMIT или ROLLBACK выполняет вызывающая сторона 🔄
2. Такая архитектура может быть выполнена и на PostgreSQL.
Но в пакетном виде ORACLE, она выглядит намного симпатичнее.
✅ Всё! Гештальт закрыт. Теперь можно и донаты «клянчить» без стыда 💸
👍 — если зашло
👎 — если нет
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
А также пишите в комменты вопросы, радость, гнев и прочие чувства 🙌
#CodeArchitecture
Изо всех комбинаций вместо „Вечность“ снова выходит „ЖОПА“.
Герда смотрит и говорит:
— Кай, да у тебя просто талант программиста!» – анекдот 😅
🏛 Продолжаем тему: Архитектура кода
Наконец, я собрался с силами и написал несколько букв «правильного» кода, демонстрирующего подход к архитектуре 🚀
📌 Сразу оговорюсь: код упрощён и создан для демонстрации.
Многие вещи в реальности делаются сложнее и эффективнее, но нельзя объять необъятное в одном посте.
Тут важна не конкретика, как именно манипулировать данными пользователей (сам код для этого не годится), а как универсальный архитектурный принцип 🧩
Я специально оставил несколько «жуков» 🐞 — внимательный глаз их заметит 👀
Для опытного разработчика хватит пары дней на разбор.
Новичку, думаю, и месяца может быть мало ⏳
Это Вам не курсы проходить и книжки читать!!!
Это результат коллективного труда, моя доля в нём не велика,
но я считаю, что такая архитектура оптимальна ⚡
🔹 Краткое описание:
1️⃣ Таблицы:
users — основные поля пользователей
users_live — расчётные поля
2️⃣ Пакеты для хранения констант:
GLOBAL_CONSTANTS — глобальные константы
USERS_CONSTANTS — константы для работы с пользователями
3️⃣ Пакеты для работы с одной строкой:
USERS_LIB — методы уровня таблицы users
USERS_LIVE_LIB — методы уровня таблицы users_live
4️⃣ Пакеты бизнес-уровня:
AUTH_LVL1_PROC — установка контекста
USERS_LVL1_PROC — операции над пользователями
USERS_LVL2_PROC — парсинг входящих данных (XML/JSON)
5️⃣ API-уровень:
APPLICATION_API — методы для вызова пользователем
APPLICATION_SRV — методы для джобов/сервисов без контекста
⚠️ Обратите внимание:
1.В коде нет операторов управления транзакциями. Он пассивен.
COMMIT или ROLLBACK выполняет вызывающая сторона 🔄
2. Такая архитектура может быть выполнена и на PostgreSQL.
Но в пакетном виде ORACLE, она выглядит намного симпатичнее.
✅ Всё! Гештальт закрыт. Теперь можно и донаты «клянчить» без стыда 💸
👍 — если зашло
👎 — если нет
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
А также пишите в комменты вопросы, радость, гнев и прочие чувства 🙌
#CodeArchitecture
👍6🤡6👎3🖕1
🤡6👍1👎1