Я написал код PL/SQL, чтобы денормализовать таблицу в форме с большей легкостью и запросом. Код использует временную таблицу для выполнения некоторой части своей работы, объединяя несколько строк из исходной таблицы.Лучший способ инкапсулировать сложную логику курсора Oracle PL/SQL в виде представления?
Логика написана как pipelined table function, следуя шаблону из связанной статьи. Функция table использует объявление PRAGMA AUTONOMOUS_TRANSACTION
, чтобы разрешить временную манипуляцию таблицами, а также принимает входной параметр курсора, чтобы ограничить денормализацию определенными значениями ID.
Затем я создал представление для запроса функции таблицы, передавая все возможные значения ID в качестве курсора (другие функции использования будут более ограничительными).
Мой вопрос: это все действительно необходимо? Я полностью пропустил гораздо более простой способ сделать то же самое?
Каждый раз, когда я касаюсь PL/SQL, создается впечатление, что я слишком много печатаю.
Обновление: Я добавлю эскиз таблицы, с которой я имею дело, чтобы дать всем представление о денормализации, о которой я говорю. В таблице хранится история работ сотрудника, каждая из которых имеет строку активации и (возможно) строку завершения. Сотрудник может иметь несколько одновременных заданий, а также одну и ту же работу снова и снова в нескончаемых диапазонах дат. Например:
| EMP_ID | JOB_ID | STATUS | EFF_DATE | other columns...
| 1 | 10 | A | 10-JAN-2008 |
| 2 | 11 | A | 13-JAN-2008 |
| 1 | 12 | A | 20-JAN-2008 |
| 2 | 11 | T | 01-FEB-2008 |
| 1 | 10 | T | 02-FEB-2008 |
| 2 | 11 | A | 20-FEB-2008 |
Выполнение запроса, чтобы выяснить, кто работает, когда в какой работе нетривиально. Таким образом, моя функция денормализации заполняет временную таблицу только диапазонами дат для каждого задания, для любого EMP_ID
s, прошедшего через курсор. Переходя в EMP_ID
s 1 и 2 будет производить следующее:
| EMP_ID | JOB_ID | START_DATE | END_DATE |
| 1 | 10 | 10-JAN-2008 | 02-FEB-2008 |
| 2 | 11 | 13-JAN-2008 | 01-FEB-2008 |
| 1 | 12 | 20-JAN-2008 | |
| 2 | 11 | 20-FEB-2008 | |
(END_DATE
позволяет NULL
с для рабочих мест, которые не имеют заданную дату окончания.)
Как вы можете себе представить, это Денормализованная форма гораздо проще, но создавать его - насколько я могу судить, требуется временная таблица для хранения промежуточных результатов (например, записи о работе, для которых найдена строка активации, но не завершение ... все же). Используя функцию конвейерной таблицы, чтобы заполнить временную таблицу, а затем вернуть ее строки, это единственный способ выяснить, как это сделать.
Очень круто. Я никогда не слышал об аналитических функциях, но я обязательно их проверю. Это выглядит намного проще, чем то, что я пробовал. – yukondude
Оказалось, что все будет хорошо. Было осложнение того, что можно иметь несколько активаций для одного завершения, но, изменив строку декодирования на: decode (next_status, 'A', next_eff_date - 1, next_eff_date), проблема была решена красиво. Огромное спасибо. – yukondude