Ответ
Да, писал хранимые процедуры на Oracle PL/SQL. Например, создание процедуры для обновления данных пользователя:
CREATE OR REPLACE PROCEDURE update_user(
p_user_id IN NUMBER,
p_new_name IN VARCHAR2,
p_new_email IN VARCHAR2
) AS
BEGIN
UPDATE users
SET name = p_new_name,
email = p_new_email
WHERE id = p_user_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END update_user;
Работал с курсорами, исключениями, пакетами. Оптимизировал запросы для работы с большими объемами данных.
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Прямо в сердце мать, вспомнил молодость. Хранимки на Oracle — это отдельный вид искусства, а иногда и ебушки-воробушки, если честно.
Вот смотри, берёшь ты такую простую задачку — обновить юзера. Вроде бы, хуй с горы, один UPDATE и делов-то. Но нет же, в корпоративном мире надо всё завернуть в процедуру, с параметрами, коммитами и откатами. Чтоб красиво было, понимаешь? Чисто для галочки, чтобы архитектор, пидарас шерстяной, доволен был.
CREATE OR REPLACE PROCEDURE update_user(
p_user_id IN NUMBER,
p_new_name IN VARCHAR2,
p_new_email IN VARCHAR2
) AS
BEGIN
UPDATE users
SET name = p_new_name,
email = p_new_email
WHERE id = p_user_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END update_user;
С виду — красота. А на деле-то волнение ебать начинается, когда эта штука в прод выкатывается и тебе говорят: «А она у нас на таблице в 500 миллионов записей тормозит». И тут ты, чувак, понимаешь, что забыл индекс на id проверить. Сам от себя охуеваешь на минуту.
А курсоры эти... Ну, ебать копать, любимая тема всех менеджеров. «Нам нужен отчёт, который проходит по всем заказам за пять лет и считает хитрую статистику». Пишешь ты курсор, запускаешь — а он жрёт память и тормозит, как черепаха в сиропе. Потом сидишь, оптимизируешь, переписываешь на bulk-операции, чтобы не по одной записи таскать, а пачками. И вот когда после трёх дней танцев с бубном оно наконец летает — чувствуешь себя богом. Ну, или по крайней мере, не таким уж распиздяем.
Исключения — это вообще отдельный цирк. WHEN OTHERS THEN — ловушка для ленивых. Захватил всё, откатил, пробросил ошибку выше. А потом наверху смотрят: «Ошибка какая-то». А какая — хуй знает, потому что ты в RAISE не добавил нормальное логирование. Приходится лезть в логи, как в тёмную комнату, и шарить руками, чтобы понять, на каком именно этапе всё накрылось медным тазом.
Пакеты — это уже высший пилотаж. Когда процедур становится овердохуища, и ты начинаешь их группировать. Создаёшь спецификацию, потом тело. Чувствуешь себя архитектором, блядь. Но это до первого момента, когда новый разработчик пытается разобраться в твоём «шедевре» и тихо матерится, потому что связи между процедурами — это лабиринт Минотавра.
В общем, работа весёлая. Сидишь, бывало, ночами, смотришь в монитор, и думаешь: «Э, бошка, думай!». А она не думает, потому что терпения ноль ебать уже. Но когда в итоге всё работает как швейцарские часы — ради этого и живёшь, чувак.