create or replace function getlegalgroup_ce(p_ceid kollecto.collection_entities.ceid%type,
p_date kollecto.legal_executory.creation_date%type) return varchar2 as v_legalgroup kollecto.groups.name%type;
v_first_group kollecto.groups.name%type;
v_idusr kollecto.users.idusr%type;
begin
select distinct first_value(coj.id_new_owner)over(partition by coj.ceid order by coj.begin_date desc) ----into v_idusr
from tver.coj
where coj.ceid=p_ceid
and trunc(p_date) between trunc(coj.begin_date) and trunc(coj.end_date);
select (select distinct first_value(g.name)over(partition by cuj.idusr order by cuj.begin_date desc)
from tver.ce_usrgroup_jnl cuj,
kollecto.groups g
where cuj.idgrp=g.idgrp
and g.unique_flag=1
--and (g.name like 'Legal_EKAT%' or g.name like 'Legal_KALUGA%' or g.name like 'Legal_VOLGA%' or g.name like 'Legal_TVER%')
and (g.name like 'Legal%' or g.name like 'Field%')
and cuj.idusr=v_idusr
and trunc(p_date)<=trunc(cuj.begin_date)) into v_first_group
from dual;
select nvl((select distinct first_value(g.name)over(partition by cuj.idusr order by cuj.begin_date desc)
from tver.ce_usrgroup_jnl cuj,
kollecto.groups g
where cuj.idgrp=g.idgrp
and g.unique_flag=1
--and (g.name like 'Legal_EKAT%' or g.name like 'Legal_KALUGA%' or g.name like 'Legal_VOLGA%' or g.name like 'Legal_TVER%')
and (g.name like 'Legal%' or g.name like 'Field%')
and cuj.idusr=v_idusr
and trunc(p_date) between trunc(cuj.begin_date) and trunc(cuj.end_date)),v_first_group) into v_legalgroup
from dual;
return v_legalgroup;
end getlegalgroup_ce;
Эта функция принимает 2 значения: p_ceid и p_date , возвращает v_legalgroup.
Как ее переписать на JOIN так, чтобы не было кучи вложенных запросов, т.к. в этом случае возникает проблема видимости v_idusr в другом подзапросе при расчете v_legalgroup, где на v_idusr связка идет.
Хотелось бы найти лаконичное решение, которое будет в дальнейшем использоваться вместо этой функции.