Издатель BI — Не может реализовать логику курсора в модели данных

#oracle #plsql #oracle11g #bi-publisher

Вопрос:

Я хочу использовать логику курсора внутри сценария модели данных, чтобы выбрать некоторые данные из таблиц на основе различных условий, но я не могу сделать это из сценария запроса модели данных, также я не могу вызвать уже сохраненную процедуру из БД, есть ли лучший вариант для этого

вот варианты, которые я уже пробовал, но получил некоторые ошибки:

  1. Я попытался создать процедуру, а затем вызвать ее также из модели данных, но вызвать процедуру из сценария модели данных невозможно, и мне нужно отразить данные процедуры в структуре модели данных, поэтому я считаю, что этот сценарий не подходит для меня.
  2. Я использовал следующую модель данных анонимных блоков решения (Процедурный вызов) в 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:

  1. Попробуйте функцию конвейерной таблицы, если вы хотите использовать процедуру для создания данных.

https://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcitblfns.htm

  1. Если вам сойдет с рук простое выполнение инструкций select с объединениями и фильтрами предложений where, это может быть самым чистым способом.
  2. Я не уверен, какова конечная цель, но функция группировки шаблонов может вам помочь. В руководствах пользователя содержится довольно много документации. поищите for-each-group в руководстве. Он используется для взятия одной плоской серии строк/элементов, а затем для создания их иерархии на лету.