Хорошей практикой в разработке баз данных 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 | Код раздела |