Ежедневный Архив: 14.04.2016

SQL and PL/SQL

Отчеты по самодокументированной базе данных

Хорошей практикой в разработке баз данных Oracle являются комментарии к объектам физического и логического слоя (таблицам, представлениям, полям) — такая БД является самодокументированной. Вместе со стандартом именования объектов это значительно облегчает жизнь команды разработчиков, облегчает введение в должность новых сотрудников.

Однако приходится иногда делать отчет с группировкой по тем или иным объектам так, чтобы он хорошо выглядел в технической документации по модулю. Приводим пример запроса, который извлекает из БД документацию по интерфейсным представлениям бизнес-модуля «Форма 302». Использованы аналитические функции LAG (предыдущее значение согласно сортировке) и DENSE_RANK (порядковый номер согласно сортировке).

  1. SELECT CASE
  2. WHEN NVL(LAG(uv1.view_name)
  3. OVER (ORDER BY uv1.view_name, tc1.column_name), '#') <> uv1.view_name
  4. THEN DENSE_RANK()
  5. OVER (ORDER BY uv1.view_name)
  6. ELSE NULL
  7. END AS r_num,
  8. CASE
  9. WHEN NVL(LAG(uv1.view_name)
  10. OVER (ORDER BY uv1.view_name, tc1.column_name), '#') <> uv1.view_name
  11. THEN uv1.view_name
  12. ELSE NULL
  13. END AS first_view_name,
  14. tc1.column_name,
  15. cc1.comments
  16. FROM USER_VIEWS uv1
  17. LEFT JOIN USER_TAB_COLUMNS tc1
  18. ON tc1.table_name = uv1.view_name
  19. LEFT JOIN USER_COL_COMMENTS cc1
  20. ON cc1.table_name = uv1.view_name
  21. AND cc1.column_name = tc1.column_name
  22. WHERE LOWER(uv1.view_name) LIKE '%302%gui%v%' /* используйте свои критерии */
  23. 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 Код раздела