CftClub.ru
Клуб специалистов ЦФТ-Банк

Представление с фильтром - как получить результат в массив?
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Июл 09, 2014 13:24    Ответить с цитатой
Полезность: Нет оценки
Damir пишет:
Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу.

Сделать можно всё.
Вопрос только во времени.

С одной стороны, сделать парсер для конкретной задачи с небольшим количеством вариантов и потом по мере увеличения вариантов его допиливать - невелика работа. Но она тем не менее есть, и это даже не пара часов.

С другой стороны, вызов операций с эмуляцией действий пользователя (то есть через АРМ Навигатор) имеет свои ограничения (нет job'ов и скорость не ахти).

Я могу только подать идею парсера.
Damir, обрати внимание, что у вьюшки есть список колонок с именами criteria_columns.
Можно выполнить replace в фильтре.
у операции фильтра есть список параметров method_parameters.
у операции фильтра есть список переменных method_variables.
Ими тоже можно заменить в фильтре ключевые строки.
id фильтра = id вьюшки.

ну и, напоследок, если написать в фильтре что-то типа and 1 in (select 1 from dual) - для пользователя IBS это будет работать, что наводит нас на мысль, что фильтр - уже написан в pl/sql
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеЧт Июл 10, 2014 06:00    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
Damir пишет:
Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу.

Сделать можно всё.
Вопрос только во времени.


В идеале, в теле операции нужно иметь возможность получать выборку из привязанной вьюшки с учетом динамического фильтра.
что-то вроде:
Код:
array_of_refs := [param_name_2].Get_refs_for_fill();

Вариантов реализации куча. Можно в интерфейсном пакете операции такие функции генерить, например. А Get_refs_for_fill() сделать поддерживаемой ядром функцией каждого параметра.
'платформу развития' еще бы подразвили чуток.

Random-чик.... как бы такой функционал в ядро засунуть?
Чтоб я его мог пользовать безвозмездно, т.е. даром - а?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Июл 11, 2014 08:17    Ответить с цитатой
Полезность: Нет оценки
Damir пишет:
Random-чик.... как бы такой функционал в ядро засунуть?
Чтоб я его мог пользовать безвозмездно, т.е. даром - а?

ИМХО, тебе это не поможет, потому что для впиливания нужна заявка от банка; выйдет явно не сейчас, а когда - хз; и, наконец, если впилится, то в новую версию ТЯ, а у вас, насколько я понял, 7.1.1.2, и меняться не собирается?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Июл 11, 2014 09:06    Ответить с цитатой
Полезность: Нет оценки
И вообще...

Код:
declare
   n   number;
   p   varchar2(32767);
begin
   for i in (
            select   short_name
               ,   crit_id
               ,   crit_formula
               ,   method_id
from method_parameters where /*method_id = '6098889' and*/ crit_formula like '%[%]%' and crit_formula like '%{%}%' and crit_formula like '%#%'
) loop
--   dbms_output.put_line(i.crit_formula);
   dbms_output.put_line('-----------');
   dbms_output.put_line(i.method_id||'->'||i.crit_id);
   dbms_output.put_line(i.crit_formula);
   select package_name into p from methods where id = i.method_id;

   for k in (select * from method_parameters where method_id = i.method_id ) loop
      i.crit_formula := replace(i.crit_formula, '['||k.short_name||']', ''''||'а здесь как-то надо получить значение параметра'||'''');
      i.crit_formula := replace(i.crit_formula, '%PARAM%.'||k.short_name, ''''||'не самая лучшая замена'||'''');
--      dbms_output.put_line(i.crit_formula);
   end loop;

   for k in (select * from method_variables where method_id = i.method_id ) loop
      i.crit_formula := replace(i.crit_formula, '['||k.short_name||']', p||'.'||k.short_name);
      i.crit_formula := replace(i.crit_formula, '%PARAM%.'||k.short_name, p||'.'||k.short_name);   --не самая лучшая замена
--      dbms_output.put_line(i.crit_formula);
   end loop;

   n := 0;
   for k in (select x.* from criteria_columns x where criteria_id = i.crit_id and unvisible = '0' order by position) loop
      n := n + 1;
      i.crit_formula := replace(i.crit_formula, '{'||k.alias||'}', 'C_'||n);
      i.crit_formula := replace(i.crit_formula, '{&'||k.alias||'}', 'REF'||n);
--      dbms_output.put_line(i.crit_formula);
   end loop;

   n := 0;
   for k in (select x.* from criteria_columns x where criteria_id = i.crit_id and unvisible = '2' order by position) loop
      n := n + 1;
      i.crit_formula := replace(i.crit_formula, '{&'||k.alias||'}', 'U_'||n);
      i.crit_formula := replace(i.crit_formula, '{'||k.alias||'}', 'U_'||n);   --   совершенно на всякий случай
--      dbms_output.put_line(i.crit_formula);
   end loop;

   dbms_output.put_line(i.crit_formula);
   for k in (select short_name from criteria where id = i.crit_id) loop
      dbms_output.put_line('select * from '||k.short_name||' where '||i.crit_formula);
   end loop;
end loop;
end;


Извини, но дальше копать у меня совершенно нет времени Sad
Могу подсказать только, что для вытаскивания значений параметров операции можно использовать макрос, исполняющийся во время компиляции, вызывающий функцию, которая посмотрит в method_parameters и вернёт строчку типа
Код:
array('P_Параметр_1'):=P_Параметр_1;
array('P_Параметр_2'):=P_Параметр_2;
--и т.д.
,
которая будет размещена в PL/PLUS-коде операции (не видна, но будет участвовать в компиляции. Потом можно посмотреть в pl/sql-пакете)
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеПт Июл 11, 2014 12:42    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
И вообще...
...
Потом можно посмотреть в pl/sql-пакете)


Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой).
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПн Июл 14, 2014 07:42    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:

Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой).

Очевидно, что создание представлений происходит непосредственно в АРМе Администратора словаря.
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеПн Июл 14, 2014 08:07    Ответить с цитатой
Полезность: Нет оценки
devor пишет:
Reddom пишет:

Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой).

Очевидно, что создание представлений происходит непосредственно в АРМе Администратора словаря.


Я имел ввиду вью, которая формируется согласно условию (фильтру) в параметре операции и представлению. Должен быть пакет которые ее собирает. И создание представлений точно не в АРМе. Так как компилировать представления и операции можно, например:
Код:
data_views.create_vw_crit(this%id, null);

или
Код:
method.recompile (this%id);
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПн Июл 14, 2014 09:30    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:

Я имел ввиду вью, которая формируется согласно условию (фильтру) в параметре операции и представлению.


В параметре ничего не формируется - там указано существующее представление, к которому просто добавляется дополнительное условие. Точно так же, как на представления накладываются ограничение на выборку строк в запросе.

Reddom пишет:

И создание представлений точно не в АРМе. Так как компилировать представления и операции можно, например:
Код:
data_views.create_vw_crit(this%id, null);

или
Код:
method.recompile (this%id);

Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре?
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеПн Июл 14, 2014 12:07    Ответить с цитатой
Полезность: Нет оценки
devor пишет:

Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре?


Ну, во-первых, компиляция очень условное понятие в ЦФТ, так как по сути происходит просто трансляция с pl-plus в pl/sql (sql) (оба языка высокого уровня). Создание имеется ввиду именно oracle views и packages, именно это и происходит при так называемой "компиляции". Исходный код (pl-plus), как раз таки храниться в БД в таблице sources. И вообще все храниться по табличкам в БД oracle (criteria_columns, method_parameters, classes и т.п.). А армы просто визуализируют данные и посылают команды.
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПн Июл 14, 2014 13:12    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:
devor пишет:

Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре?


Ну, во-первых, компиляция очень условное понятие в ЦФТ, так как по сути происходит просто трансляция с pl-plus в pl/sql (sql) (оба языка высокого уровня). Создание имеется ввиду именно oracle views и packages, именно это и происходит при так называемой "компиляции". Исходный код (pl-plus), как раз таки храниться в БД в таблице sources. И вообще все храниться по табличкам в БД oracle (criteria_columns, method_parameters, classes и т.п.). А армы просто визуализируют данные и посылают команды.

Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок? Smile
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеПн Июл 14, 2014 14:11    Ответить с цитатой
Полезность: Нет оценки
devor пишет:

Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок? Smile


Тогда расскажи ты как на самом деле. Very Happy
Я буду рад ознакомиться и проверить твою версию.
Форум для того и создан, чтобы делиться знаниями Exclamation
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеВт Июл 15, 2014 10:42    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:
devor пишет:

Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок? Smile


Тогда расскажи ты как на самом деле. Very Happy
Я буду рад ознакомиться и проверить твою версию.
Форум для того и создан, чтобы делиться знаниями Exclamation


Уже рассказал и поделился.
И вместо мощных выводов в стиле "И создание представлений точно не в АРМе" возьми да и включи трейс и профайлер для сессии АРМа, создай представление в нем, а потом смотри запросы и вызываемые пакеты.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Июл 15, 2014 13:23    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:
Random пишет:
И вообще...
...
Потом можно посмотреть в pl/sql-пакете)


Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой).


Если у вас есть эта возможность, опубликуйте.

А если это был вопрос, то расставляйте вопросительные знаки, пожалуйста.

PS: Вы оба правы.
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеВт Июл 15, 2014 14:48    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

А если это был вопрос, то расставляйте вопросительные знаки, пожалуйста.


Это был вопрос.
devor пишет:

включи трейс


Вот что примечательного в трейсе:
Код:
BEGIN :RESULT :=IBS.Data_Views.Create_Criterion3(:ID,:NAME,:SN,:CLASS,:COND,:FLAGS,:ORIGHTS,:HATTR,:TMPDEF,:PROP,:CELL,:ORDER,:AG,:CARD); END;
BINDS #4574675488:
 Bind#2
  value="***. 123"
 Bind#3
  value="VW_CRIT_***_T_1"
 Bind#4
  value="***_RPT_CTRL"
 Bind#5
  value="type main is
select d(1 : d) in dual%rowtype;
"
 Bind#10
  value="|NoSystem|NoID|PlPlus|AllMethods Y"


Т.е. текст pl-plus был выбран с окна, но функция, которая формировала находится в БД: Create_Criterion3. Также нашел в трейсе таблицы соответствия наименований колонок (альясы колонок) и параметров операций их реальных объектов БД (глобальные переменные пакетов). Дальше шли функции преобразования pl-plus текста в pl/sql.

Спасибо за идею. Только утвердился в своих некоторых догадках фактами.
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеВт Июл 15, 2014 14:56    Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:

Вот что примечательного в трейсе:
Код:
BEGIN :RESULT :=IBS.Data_Views.Create_Criterion3(:ID,:NAME,:SN,:CLASS,:COND,:FLAGS,:ORIGHTS,:HATTR,:TMPDEF,:PROP,:CELL,:ORDER,:AG,:CARD); END;
BINDS #4574675488:
 Bind#2
  value="***. 123"
 Bind#3
  value="VW_CRIT_***_T_1"
 Bind#4
  value="***_RPT_CTRL"
 Bind#5
  value="type main is
select d(1 : d) in dual%rowtype;
"
 Bind#10
  value="|NoSystem|NoID|PlPlus|AllMethods Y"


Т.е. текст pl-plus был выбран с окна, но функция, которая формировала находится в БД: Create_Criterion3. Также нашел в трейсе таблицы соответствия наименований колонок (альясы колонок) и параметров операций их реальных объектов БД (глобальные переменные пакетов). Дальше шли функции преобразования pl-plus текста в pl/sql.

Спасибо за идею. Только утвердился в своих некоторых догадках фактами.


pl/plus в АРМе, далее функция plp2sql.criteria2plsql и триггеры формируют pl/sql.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru