Вот мое предложение.
Сначала простой тестовый пример:
SQL> create table lds_consultant
2 (consultant_id number,
3 location varchar2(30));
Table created.
SQL> insert into lds_consultant
2 select 1, 'New York' from dual union
3 select 2, 'London' from dual;
2 rows created.
Функция:
- имя параметра, так что его имя явно отличается от имени столбца. Пусть оно наследует тип столбца
- то же самое относится и к возвращаемому значению. Например, перед его именем, например, "L_", указана локальная переменная
- Использование функции MAX в операторе SELECT - это простой способ избежать ошибок TOO_MANY_ROWS или NO_DATA_FOUND. Тем не менее, я бы посоветовал вам правильно обращаться с ними при необходимости
SQL> create or replace function get_location
2 (par_consultant_id in lds_consultant.consultant_id%type)
3 return lds_consultant.location%type
4 is
5 l_location lds_consultant.location%type;
6 begin
7 select max(l.location)
8 into l_location
9 from lds_consultant l
10 where l.consultant_id = par_consultant_id;
11 return l_location;
12 end;
13 /
Function created.
Наконец, то, как вы это называете: стандарт , способ , выбор ... из двойного :
SQL> select get_location(2) result_1,
2 get_location(-1) result_2
3 from dual;
RESULT_1 RESULT_2
------------------------------ ------------------------------
London
SQL>
[EDIT]
Поскольку Apex использует PL / SQL, вам нужно объявить локальную переменную и поместить в нее результат этой функции. Примерно так:
declare
l_result lds_consultant.location%type;
begin
l_result := get_location(:P1_CONSULTANT_ID);
end;
Или, если бы это был отчет, вы бы включили его в оператор SELECT как
select l.consultant_id,
l.consultant_name,
get_location(l.consultant_id) location
from lds_consultant l
order by l.consultant_name;
Кстати, выбор из двойного работает в любом месте Oracle (включая Apex).