oracle数据库自定义函数问题

最近在写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;

保存后提示错误原文

img

稍加翻译后的报错

img

我想要的结果是传递'10202804/10133066/10131810',和自定义分隔符‘/’,返回内容 '张三/李四/王五' ,如果其中一个没有的话就比如王五没有查询到就返回'张三/李四/10131810'

函数调用 split_query('10202804/10133066/10131810','/')

上传的代码貌似不太友好,还要别人帮你排版

翻翻尘封的书,做了该问题的完整测试。
形成Word文档《oracle数据库自定义split函数问题》:
https://download.csdn.net/download/m0_54619218/87246637
创建测试用表test_01:

create table test_01 (name varchar2(10),bh varchar2(8));
insert into test_01 values('张三','10202804');
insert into test_01 values('李四','10133066');
insert into test_01 values('王五','10133067');
commit;

如果Oracle 建库时包含APEX,则直接可以使用

select * from table(apex_string.split('10202804/10133066/10131810','/')) ;

Oracle 用 REGEXP_SUBSTR 实现split语句如下:

SELECT REGEXP_SUBSTR('10202804/10133066/10131810', '[^/]+', 1, LEVEL, 'i') AS STR
FROM DUAL CONNECT BY LEVEL <=LENGTH('10202804/10133066/10131810') - LENGTH(REGEXP_REPLACE('10202804/10133066/10131810', '/', ''))+1;  

自定义函数具体实现:使用REGEXP_SUBSTR创建split函数,分隔符可以自定义,设置默认分隔符’/’,可以免输入。
创建job_split函数调用split,关联test_01表,按字符串参数输入顺序返回结果。

用例结果 10202804/ 10133066/ 10131810
        张三/李四/10131810(不存在)

请参考附件:完整代码
测试结果:自定义分割符有效

select job_split('10202804/10133066/10131810','/')  as res_str from dual;
select job_split('10202804,10133066,10131810',',')  as res_str from dual;
select job_split('10202804:10133066:10131810',':')  as res_str from dual;


img