19.10.2012

WF: Бизнес-событие и подписка с пользовательской логикой на PL/SQL

Выполнение PL/SQL кода, инициируемого бизнес-событием.

Создание БС и подписки аналогично предыдущему примеру: повторяем для нового БС Шаг 1 и Шаг 3. Создание подписки отложим, для того чтобы cначала реализовать нашу функцию на PL/SQL. Стандратный WF API предусматривает следующую структуру:
 function f_custom(p_subscription_guid in raw,
                        p_event in out nocopy wf_event_t
 ) return varchar2
 is
 l_attr1        number;
 l_attr2        varchar2(150);
 l_attr3        varchar2(30);
 begin

     -- получение параметров
      l_attr1 := p_event.getValueForParameter('p_attr1');
      l_attr2 := p_event.getValueForParameter('p_attr2');
      l_attr3 := p_event.getValueForParameter('p_attr3');
      /* какой-то код */
      return 'SUCCESS';
      exception when others then
         WF_EVENT.setErrorInfo(p_event, 'ERROR');
         return 'ERROR';
 end add_element;
Получение параметров осуществляется с помощью метода p_event.getValueForParameter(<name>).

В Шаге 4 выбираем Custom, т.е. реализацию пользовательской бизнес-логики:

Далее указываем PL/SQL функцию



Шаг 5. Инициирование бизнес-события через Workflow PL/SQL API:
declare
  -- структура с параметрами
 prm_list wf_parameter_list_t;
 l_prm1         varchar2(255);
 l_prm2         number;
begin
 -- добавление параметров
 WF_EVENT.AddParameterToList( p_name => 'p_attr1',
                              p_value => 10,
                              p_parameterlist => prm_list
                             );     
 WF_EVENT.AddParameterToList( p_name => 'p_attr2',
                              p_value => 'A',
                              p_parameterlist => prm_list
                             );
 WF_EVENT.AddParameterToList( p_name => 'p_attr3',
                              p_value => 'Z',
                              p_parameterlist => prm_list
                             );
/* p_event_key - идентификатор бизнес-события
    Если повторится дважды, событие просто не отработет */
 WF_EVENT.RAISE(p_event_name => 'oracle.xxxx.test.events.plsql'
                ,p_event_key  => 'ACCOKey1' || to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS')
                ,p_parameters => prm_list
                );    
end;

Комментариев нет :