plsql函数-根据传递的数字返回

时间:2018-11-02 00:01:50

标签: oracle plsql

我期望基于传递给我的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 :(得分:0)

您找到与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函数中。但这当然不是必需的,您也可以直接运行查询。