Функция plsql - возврат на основе переданного числа - PullRequest
0 голосов
/ 02 ноября 2018

Я ожидаю разные значения, основанные на вводе, переданном в мою функцию plsql. Извиняюсь, что я довольно новичок в plsql ...

Диапазон 1 2 3 , , 9 45 46 86

Моя функция, как показано ниже:

CREATE OR REPLACE function get_ext (p_str varchar2) 
return varchar2 
is

cursor ext is
select range from table where length(range)>1;

v_str varchar2(100);
v_ext number;
v_length number := 0;
v_range varchar2(200);

BEGIN
open ext;
fetch ext into v_range;

v_str := p_str;
v_str := trim(substr(v_str,1,4));
v_length := length(v_str);

for i in 1..v_length loop
   BEGIN      
     v_ext := substr(v_str, i,1);                
   EXCEPTION
   WHEN OTHERS THEN
     RETURN p_str;
  END;
end loop;

RETURN
case when ext%FOUND then substr(v_str,1,2)
else substr(v_str,1,1)
end;
close ext;

EXCEPTION
WHEN OTHERS THEN
RETURN 'Err';
END;

Он всегда возвращает первые две цифры переданного параметра, но не 1 цифру, которую я ожидаю, когда не найден.

тестирование функции

select get_ext('4588') from dual

возвращает 45

select get_ext('1822') from dual

возвращает 18, тогда как я ожидаю, что он вернет 1

Заранее спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

Вы находите совпадающие значения диапазона с LIKE. Начиная с Oracle 12c, вы можете использовать FETCH FIRST, чтобы получить совпадение с самой длинной длиной:

select range
from mytable
where :str like range || '%'
order by length(range) desc
fetch first row only;

Или используйте KEEP LAST, который также доступен в более ранних версиях:

select max(range) keep (dense_rank last order by length(range))
from mytable
where :str like range || '%';

И если вам это нравится больше, поместите этот запрос в функцию PL / SQL. Но это не обязательно, конечно, вы также можете выполнить запрос напрямую.

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