甲骨文创建自定义函数返回varchar类型

  

需求描述:两张表,如下,需要查询tmp1表中id_new在tmp2中的名称
<强>选择从tmp1 ;<强>
凹坠俏拇唇ㄗ远ㄒ搴祷豽archar类型”
从tmp2;选择

凹坠俏拇唇ㄗ远ㄒ搴祷豽archar类型”
方法一:
好处:简单,直接sql展示
劣处:如果主表数据量太大,十几亿的话,性能会大大下降,此时建议第二种方法
<强>选择一个。id_old
to_char (wm_concat(不同a.id_new)) id_new,
to_char (wm_concat(不同b.name))的名字从tmp2 b
,
(选择一个。的id_old, regexp_substr (a。id_new”[^] + ', 1级)id_new从tmp1

连接水平& lt;=regexp_count (a。”、“id_new) + 1)
的地方。id_new=b.id_old (+)
group by a.id_old;

  

方法二:创建自定义函数来实现
<强>创建或替换函数f_tmp_split (p_str varchar2, p_f varchar2)
返回varchar2
v_pos pls_integer:=0;——获取当前分隔符位置
v_pre_pos pls_integer:=1;——从第几位开始截取
v_len pls_integer:=0;——字符串长度
v_len1 pls_integer:=0;——分隔符长度
v_result dbms_sql.Varchar2_Table;——结果集
v_num pls_integer:=1;——元素数量
v_name_class varchar2 (1000);——返回的集合
v_name_tmp varchar2 (1000);——返回拼接的值

v_len:=长度(p_str);
v_len1:=长度(p_f);
, v_pos & lt;v_len循环
v_pos:=instr (p_str, p_f v_pre_pos);
如果v_pos=0
v_pre_pos:=v_len;
v_result (v_num):=substr (p_str v_pre_pos);

开始选择a.name
到v_name_tmp
tmp2
的地方。id_old=v_result (v_num);

异常当no_data_found
v_name_tmp:=",
结束;
v_name_class:=v_name_class | | v_name_tmp;
如果v_pre_pos祝辞=v_len然后
退出;
结束;如果其他

v_result (v_num):=substr (p_str、v_pre_pos v_pos - v_pre_pos);

开始选择a.name | | p_f
到v_name_tmp
tmp2
的地方。id_old=v_result (v_num);

异常当no_data_found
v_name_tmp:=",
结束;
v_name_class:=v_name_class | | v_name_tmp;
v_pre_pos:=v_pos + v_len1;
结束如果;
结束循环;
返回v_name_class;
,

  

效果如下:
凹坠俏拇唇ㄗ远ㄒ搴祷豽archar类型"

  

凹坠俏拇唇ㄗ远ㄒ搴祷豽archar类型"

甲骨文创建自定义函数返回varchar类型