#oracle #plsql #oracle11g #bi-publisher
Вопрос:
Я хочу использовать логику курсора внутри сценария модели данных, чтобы выбрать некоторые данные из таблиц на основе различных условий, но я не могу сделать это из сценария запроса модели данных, также я не могу вызвать уже сохраненную процедуру из БД, есть ли лучший вариант для этого
вот варианты, которые я уже пробовал, но получил некоторые ошибки:
- Я попытался создать процедуру, а затем вызвать ее также из модели данных, но вызвать процедуру из сценария модели данных невозможно, и мне нужно отразить данные процедуры в структуре модели данных, поэтому я считаю, что этот сценарий не подходит для меня.
- Я использовал следующую модель данных анонимных блоков решения (Процедурный вызов) в Oracle BI Publisher (Oracle Fusion):http://oracleappssolutiions.blogspot.com/2020/12/anonymous-blocks-procedural-call-data.html это идеально подходит, когда нам нужен простой «выбор», но мы не можем использовать более сложную логику, подобную этой:
DECLARE type refcursor is REF CURSOR; xdo_cursor refcursor; BEGIN OPEN :xdo_cursor FOR FOR c IN (select t.* from test t where t.VERSION=2) LOOP FOR d in (select c.* from record d where CONNECT_BY_ISLEAF = 0 start with d.id. = c.id connect by prior d.id = c.id) loop select * test where id=d.id end loop; END LOOP; END;
когда я пытаюсь запустить это, я получаю аналогичные ошибки:
Пожалуйста, поделитесь своими мыслями/идеями
Спасибо
Комментарии:
1. Зачем вам нужен курсор? Не может ли это быть обработано с помощью союзов и где пункты?
2. Я никогда не работал с OBI, но у меня довольно большой опыт работы с другими инструментами отчетности. Я предполагаю, что проблема здесь в том, что OBI хочет получить запрос или процедуру. Я отказываюсь от предположений, но большинство инструментов Oracle позволяют создавать процедуры в качестве единицы программирования. Вы всегда можете указать параметр out в процедуре в виде sys_refcursor, который, скорее всего, «обманет» OBI, заставив его думать, что это обычный запрос. Это мое предположение, я удалю комментарий, если вы меня поправите.
3. @EdHayes3 Я думал, что это будет более структурированный и простой способ использовать курсоры (для создания логики цикла) для структуры иерархии настроек.
Ответ №1:
- Попробуйте функцию конвейерной таблицы, если вы хотите использовать процедуру для создания данных.
https://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcitblfns.htm
- Если вам сойдет с рук простое выполнение инструкций select с объединениями и фильтрами предложений where, это может быть самым чистым способом.
- Я не уверен, какова конечная цель, но функция группировки шаблонов может вам помочь. В руководствах пользователя содержится довольно много документации. поищите
for-each-group
в руководстве. Он используется для взятия одной плоской серии строк/элементов, а затем для создания их иерархии на лету.