Хорошей практикой в разработке баз данных Oracle являются комментарии к объектам физического и логического слоя (таблицам, представлениям, полям) – такая БД является самодокументированной. Вместе со стандартом именования объектов это значительно облегчает жизнь команды разработчиков, облегчает введение в должность новых сотрудников.
Однако приходится иногда делать отчет с группировкой по тем или иным объектам так, чтобы он хорошо выглядел в технической документации по модулю. Приводим пример запроса, который извлекает из БД документацию по интерфейсным представлениям бизнес-модуля “Форма 302”. Использованы аналитические функции LAG (предыдущее значение согласно сортировке) и DENSE_RANK (порядковый номер согласно сортировке).
SELECT CASE
WHEN NVL(LAG(uv1.view_name)
OVER (ORDER BY uv1.view_name, tc1.column_name), '#') <> uv1.view_name
THEN DENSE_RANK()
OVER (ORDER BY uv1.view_name)
ELSE NULL
END AS r_num,
CASE
WHEN NVL(LAG(uv1.view_name)
OVER (ORDER BY uv1.view_name, tc1.column_name), '#') <> uv1.view_name
THEN uv1.view_name
ELSE NULL
END AS first_view_name,
tc1.column_name,
cc1.comments
FROM USER_VIEWS uv1
LEFT JOIN USER_TAB_COLUMNS tc1
ON tc1.table_name = uv1.view_name
LEFT JOIN USER_COL_COMMENTS cc1
ON cc1.table_name = uv1.view_name
AND cc1.column_name = tc1.column_name
WHERE LOWER(uv1.view_name) LIKE '%302%gui%v%' /* используйте свои критерии */
ORDER BY uv1.view_name, tc1.column_name
Часть результатов, включая недокументированные представления, пустая – есть где поработать техническим писателям!
1 | CBR_302_GUI_DICT_BS_V | BUSINESS_SIZE_CD | |
BUSINESS_SIZE_NAME | |||
SORT_ID | |||
2 | CBR_302_GUI_DICT_OKATO_V | OKATO_CD | |
OKATO_CODE | |||
SORT_ID | |||
3 | CBR_302_GUI_DICT_OKVED_V | OKVED_CD | |
OKVED_CODE | |||
SORT_ID | |||
4 | CBR_302_GUI_OKATO_V | AS_OF_DATE | Отчетная дата |
FDDR_ID | ID ФДП-отчета | ||
OKATO | Код Окато | ||
SECT_ID | Код раздела |