Способ использования like с параметрами заключается в использовании оператора конкатенации ||
, поэтому ваша функция будет выглядеть следующим образом, которая будет возвращать все, что начинается с street
или city
:
create or replace function uf_search_address ( P_street IN varchar2
, P_city IN varchar2
) return number is
rcvd_person_id number;
begin
select person_id
into rcvd_person_id
from t_participants
where complete_address like P_street || '%'
or complete_address like P_city || '%'
;
return rcvd_person_id;
exception when no_data_found then
return null;
end;
/
show error
Однако Если существует более чем одно значение, которое соответствует этому запросу, оно не будет выполнено. Поскольку у вас больше одного человека на город, вполне вероятно, что то, что вы пытаетесь сделать, никогда не сработает. Обратите внимание также на обработчик исключений, как если бы не было совпадений для вашего запроса, Oracle также выдаст ошибку.
Вам нужно будет принять какое-то решение в коде:
Это можно сделать в SQL, например, с помощью rank
. В приведенном ниже примере отметкой времени будет дата ввода в таблицу для очень упрощенной системы ранжирования:
select person_id
into rcvd_person_id
from ( select person_id
from ( select person_id
, rank() over ( order by timestamp desc ) as rnk
from t_participants
where complete_address like P_street || '%'
or complete_address like P_city || '%'
)
where rnk = 1
)
В качестве альтернативы вы можете принять решение в PL \ SQL, собрав все в тип и выполнив некоторые циклы.