最近在写sql时候想写个函数调用配合sql使用,大概描述下需求有个字段,工号JOB_NUMBER ='10202804/10133066/10131810',数据库里是编号,所有想写个函数,将JOB_NUMBER 传递进去,然后返回 '张三/李四/王五',如果王五不存在则返回昵称拼接code '张三/李四/10131810',因为数据库函数这块不怎么用,所以不太会写,需要前辈的指点,数据库是oracle的
下面是我写的函数,但是报错肯定有问题,然后不会改了,希望会的前辈给我指点一下,先说下我的大体思路就是想循环传递进来的参数,有可能【一个:‘10202804’ 只有一个code]就不用循环了,返回张三】,【多个:'10202804/10133066/10131810'多个才循环,返回'张三/李四/王五'】,SELECT NICK_NAME AS nick_name_str from SYS_USER su where su.user_name = str是我查询用户表,查询用户昵称的sql
CREATE OR REPLACE FUNCTION split_query RETURN(piv_str varchar2, p_sep varchar2 := ',')
l_idx number:=0; -- 用于计算piv_str1中分隔符的位置
str varchar2(500); -- 根据分隔符截取的子字符串
piv_str_a varchar2(500) := piv_str; -- 将piv_str赋值给piv_str_a
nick_name_str VARCHAR2(500); --查询到的结果
ret_str varchar2(500); -- 返回的数据
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 THEN
IF piv_str = piv_str_a THEN
SELECT NICK_NAME AS nick_name_str from SYS_USER su where su.user_name = piv_str
ret_str := nick_name_str;
END IF;
ELSE
-- 循环按分隔符截取piv_str
LOOP
l_idx := instr(piv_str,p_sep);
-- 当piv_str中还有分隔符时
IF l_idx > 0 THEN
-- 截取第一个分隔符前的字段str
str:= substr(piv_str,1,l_idx-1);
SELECT NICK_NAME AS nick_name_str from SYS_USER su where su.user_name = str
ret_str = concat(ret_str, concat('/', nick_name_str))
-- 无论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回ret_str
RETURN ret_str;
END;
保存后提示错误原文
稍加翻译后的报错
我想要的结果是传递'10202804/10133066/10131810',和自定义分隔符‘/’,返回内容 '张三/李四/王五' ,如果其中一个没有的话就比如王五没有查询到就返回'张三/李四/10131810'
函数调用 split_query('10202804/10133066/10131810','/')