Один из способов сделать это - вставить вложенные операторы IF, что-то вроде этого:
create or replace function get_queue_id
(p_product_code in mo_product_master.product_code%type
, p_intermediary_code in intrfc_intermediary_mstr_view.intermediary_code%type)
return mo_product_master.queue_id%type
as
return_value number;
begin
-- preferred_choice
begin
select pm.queue_id
into return_value
from mo_product_master pm
where pm.product_code=p_product_code
exception
when no_data_found then
null;
end;
if return_value is null then
-- second_choice
begin
select qim.queue_id
into return_value
from mo_queue_inter_map_master qim
, intrfc_intermediary_mstr_view imv
where qim.category_code =imv.category_code
and imv.intermediary_code=p_intermediary_code;
exception
when no_data_found then
null;
end;
if return_value is null then
-- default_value
select id
into return_value
from mo_queue_master
where queue_name='others'
and status='Active';
end if;
end if;
return return_value;
end;
/
Это немного неуклюже, но делает свою работу.
Подавление исключения NO_DATA_FOUND обычно не рекомендуется, но я думаю, что оно подходит для этого сценария: не обнаружение первого QUEUE_ID является частью обычной бизнес-логики, а не исключением, которое необходимо обработать.Я не думаю, что вложение последующих выборок в обработчик исключений почти так же выразительно, как бизнес-правила.