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

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

Основатель: @denis_dbd Кивилёв Денис
Помощница: @love_flowerrr
Download Telegram
Dbms_rowid интересный пакет, который может пригодится

Друзья, всем привет! 👋
С вами Денис.
В нашем канале разного уровня специалисты, этот пост зайдет Middle- и Senior-ребятам, но и Junior могут почерпнуть полезное.

Итак, каждый разработчик Oracle хотя бы раз сталкивался с ROWID — уникальным идентификатором строки в базе. Cодержит информацию о типе ROWID, идентификаторе объекта, относительном номере файла (relative file number), номере блока и номере строки в блоке.

Но как разобрать его на части или создать искусственно? Здесь на помощь приходит пакет DBMS_ROWID. Это не просто утилита, а мощный инструмент для глубокого анализа и манипуляций с данными на уровне блоков. В реальной жизни он спасает при отладке, миграциях или оптимизации хранения. Без него сложно понять, где именно лежит ваша запись в файлах данных.

Пакет DBMS_ROWID появился в Oracle для работы с ROWID из PL/SQL и SQL. Он позволяет извлекать информацию о блоках данных, файлах, объектах и даже создавать тестовые ROWID.

Ключевые функции пакета

DBMS_ROWID.ROWID_CREATE — создает ROWID для тестирования. Полезно, когда нужно симулировать запись без реальной БД.
DECLARE
v_rowid ROWID;
BEGIN
v_rowid := DBMS_ROWID.ROWID_CREATE(
rowid_type => sys.dbms_rowid.rowid_type_extended,
object_number => 12345,
relative_fno => 1,
block_number => 100,
row_number => 5
);
DBMS_OUTPUT.PUT_LINE(v_rowid);
END;


DBMS_ROWID.ROWID_INFO — разбирает существующий ROWID на компоненты: тип, номер объекта, файл, блок и строку.
DECLARE
v_rowid ROWID := 'AAAAAAAABAAAALaAAA';
v_type NUMBER;
v_object NUMBER;
v_file NUMBER;
v_block NUMBER;
v_row NUMBER;
BEGIN
DBMS_ROWID.ROWID_INFO(
rowid_in => v_rowid,
rowid_type => v_type,
object_number => v_object,
relative_fno => v_file,
block_number => v_block,
row_number => v_row
);
DBMS_OUTPUT.PUT_LINE('Объект: ' || v_object || ', Блок: ' || v_block);
END;


Другие полезные модули
ROWID_BLOCK_NUMBER возвращает номер блока,
ROWID_OBJECT — номер объекта,
ROWID_RELATIVE_FNO — относительный номер файла,
ROWID_ROW_NUMBER — номер строки в блоке,
ROWID_TO_ABSOLUTE_FNO — абсолютный номер файла,
ROWID_TO_EXTENDED и ROWID_TO_RESTRICTED для конвертации типов,
ROWID_TYPE для проверки типа,
ROWID_VERIFY для валидации.

Для чего использовать DBMS_ROWID
🔸 Диагностика инцидентов — быстро найти физическое местоположение проблемной строки по ROWID из alert.log/trace.
🔸 Анализ ошибок — определить повреждённый блок, файл и объект.
🔸 Контроль миграций/восстановлений — сверка фактического физического размещения строк между средами.
🔸 Анализ распределения данных — понять плотность блоков, выявить горячие сегменты или неэффективную кластеризацию.
🔸 Работа с партиционированием — определить точный партишен/subpartition, где находится строка.
🔸 Точечный доступ к данным — выборка строк по известным физическим координатам без сложных JOIN.
🔸 Служебное логирование — фиксировать ROWID проблемных записей для последующей диагностики.
🔸 Создание воспроизводимых тестов — моделирование ситуаций с повреждёнными или смещёнными строками.

Пост был навеян лекцией в субботу. Показывал ребятам свой код с Магнита, написанный в 17м году. И наткнулся на dbms_rowid.rowid_object(v_rowid). На скрине выше ⬆️


Используете ли вы DBMS_ROWID в проектах? Поделитесь кейсами, когда он выручил, в комментариях 💬

Всем продуктивного дня и удачных запросов! 🌟

#oracle #dbms_rowid #rowid #plsql #oracledev #базыданных #sql

Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀

Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"

📱 Facebook 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱 Threads RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91