Насколько я могу судить, этот код действительно недействителен. Тот, который следует, может скомпилироваться. Обратите внимание, что:
- Я создал локальные переменные, которые будут содержать результат операторов SELECT. Они вам нужны в PL / SQL
- Я пытался показать вам, что исключения должны обрабатываться. В «IF-THEN-ELSE» нет особой пользы, потому что - если первый SELECT (я назвал его «A») завершится неудачно, он не вернет NULL, но вызовет исключение NO_DATA_FOUND. Я не знаю ни ваших таблиц, ни данных, которые вы там храните, поэтому - возможно, этот код не содержит исключений, я не могу сказать.
- Я не смог проверить это, так как у меня нет ваших таблиц, и я не хотел их создавать сам.
declare
l_t_basis_access_id eckernel_mca.t_basis_access.t_basis_access_id%type;
l_object_id eckernel_mca.ov_area.object_id%type;
l_name eckernel_mca.ov_area.name%type;
begin
-- SELECT "A"
select t_basis_access_id
into l_t_basis_access_id
from eckernel_mca.t_basis_access
where role_id like 'MCA.GFS.LEAD';
-- SELECT "A" returned a single value - proceed with the next SELECT "B"
-- SELECT "B"
select object_id, name
into l_object_id,l_name
from eckernel_mca.ov_area
where end_date is null
and object_id in (select distinct replace(replace(replace(attribute_text,'(',''),')',''),'''','')
from eckernel_mca.t_basis_object_partition
where t_basis_access_id in (select t_basis_access_id
from eckernel_mca.t_basis_access
where role_id like 'MCA.GFS.LEAD'
)
);
exception
when no_data_found then
-- SELECT "A" didn't return anything and raised no_data_found; but, SELECT "B" might
-- raise it as well
select object_id, name
into l_object_id,l_name
from eckernel_mca.ov_area
where end_date is null;
when too_many_rows then
-- Any SELECT involved in this code could return it, so - handle it, if necessary
end;