Поиск строки с использованием функции - Oracle - PullRequest
0 голосов
/ 04 февраля 2012

Я пытаюсь найти строку, используя входные значения, переданные моей функции Oracle. Ниже приведен код [изменен, поскольку я не могу вставить исходный код]:

CREATE OR REPLACE FUNCTION uf_search_address
(
   street  IN VARCHAR2,
   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 street[?] OR COMPLETE_ADDRESS LIKE city[?]
   RETURN (RCVD_PERSON_ID);
END;

Но запрос ничего не возвращает (хотя он компилируется).

Как я могу использовать функциональность LIKE с переданными параметрами?

1 Ответ

1 голос
/ 04 февраля 2012

Способ использования 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, собрав все в тип и выполнив некоторые циклы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...