, , ,

Удаление BPEL Instance’ов и Human Task’ов.

четверг, 8 октября 2009 г. Оставить комментарий

Иногда надо почистить BPEL инстансы и очень хочется, чтобы это происходило автоматически. Для ручного удаления можно воспользоваться BPEL консолью, но там есть большой недостаток – не возможно удалить все дерево связанных процессов. Чтобы это можно было сделать я написал небольшой пакетик. Одна процедура удаляет Human Task’и, другая связанные BPEL инстансы и Human Task’и.


create or replace package bpel_enhancement is

procedure delete_ci( p_cikey in cube_instance.cikey%type
,p_ignore_root in boolean default false
);

procedure delete_wt(p_taskid in wftask.taskid%type
);

end bpel_enhancement;
/
create or replace package body bpel_enhancement is

procedure delete_ci( p_cikey in cube_instance.cikey%type
,p_ignore_root in boolean default false
)
is
vi pls_integer;
begin

-- Проверим сначала, что инстанс не имеет родителей
select count(1)
into vi
from cube_instance
start with cube_instance.cikey = p_cikey
connect by to_char(cube_instance.cikey) = prior to_char(cube_instance.parent_id);

if (vi = 0) then
raise_application_error(-20000, 'Не найден инстанс "' || p_cikey || '"');
elsif (vi > 1) then
if not p_ignore_root then
raise_application_error(-20000, 'Найдены родительские процессы для инстанса "' || p_cikey || '"');
end if;
end if;

-- начинаем удалять иерархически в обратном порядке
for vCur in (
select cube_instance.*
from cube_instance
start with cube_instance.cikey = p_cikey
connect by prior to_char(cube_instance.cikey) = to_char(cube_instance.parent_id)
order by level desc
) loop
-- Удаляем инстанс
dbms_output.put_line('Удаление истанса: "' || vCur.Cikey || '" -- "' || vCur.Title || '"');
collaxa.delete_ci(p_cikey => vCur.cikey);

-- Ищем связанные задачи
for vCurTask in (
select *
from wftask
where wftask.instanceid = vCur.cikey
) loop

dbms_output.put_line('Удаление задачи: "' || vCurTask.Taskid || '" -- "' || vCurTask.Tasknumber || '"');
delete_wt(vCurTask.Taskid);
end loop;
end loop;

end delete_ci;

procedure delete_wt(p_taskid in wftask.taskid%type
)
is
begin
delete from wftaskhistory where taskid = p_taskid;
delete from wfassignee where taskid = p_taskid;
delete from wfattachment where taskid = p_taskid;
delete from wfcomments where taskid = p_taskid;
delete from wfmessageattribute where taskid = p_taskid;
delete from wfnotification where taskid = p_taskid;
delete from wfnotificationmessages where taskid = p_taskid;
delete from wfroutingslip where taskid = p_taskid;
delete from wftasktimer where taskid = p_taskid;

delete from wftask where taskid = p_taskid;
end delete_wt;

end bpel_enhancement;
/

0 коммент. »

Оставьте Ваш комментарий