我期望基于传递给我的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
预先感谢
答案 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函数中。但这当然不是必需的,您也可以直接运行查询。