oralce函数 根据分隔符查询得到对应的信息-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

oralce函数 根据分隔符查询得到对应的信息

简介:
需求是这样子的。
先不考虑数据表设计的合理与否。
 
有两张表:一个是变更申请表t_apply表,存放的是申请信息。
一个是人员信息t_user。 申请表中通知人员的外键,参考t_user。
其中两个表之间的一对多的关系放在t_apply 维护的。
数据如下。
------------------------------------------------------------------------------------------------------------
t_apply
--------------------------------
id              noticeman
1               user1,user2,user3
2               user2,user3
 
t_user
----------------------------
username            name
user1                     用户1
user2                    用户2
user3                   用户3
 
---------------------------------------------------------------------------------------------------
 
现在,想根据noticeman 存放的数据,查询 t_user表 ,将替换成相应的name。
 
 
有2个思路: 一个是JAVA 程序实现。首先将noticeman 这个字符串取出来,然后借用split()方法,生成数组,然后循环查询用户表,然后将得到的查询的用户信息,在组合成字符串。效率不太理想。放弃!
第二种方案,是用Oracle 的函数实现。这样就可以在执行SQL查询的时候,就可以一次取出来了。
代码如下:
create or replace function fn_getnames_splitor(psrcstring in varchar2,    
                                                                                             psplitor in varchar2,    
                                                                                             ptype in varchar2)    
return varchar2    
is    
        v_srcstring varchar2(100):=psrcstring; 
            v_num_start number :=0; 
            v_num_current number:=0; 
            v_temp varchar2(10); 
            v_temp2 varchar2(10); 
            v_target varchar2(100); 
begin 
     
     loop 
                 v_num_start := instr(v_srcstring,psplitor); 
             exit when v_num_start =0;             
                v_temp := SUBSTR(v_srcstring,0,v_num_start-1); 
            select dname    into v_temp2 from dept where deptno=to_number(v_temp); 
                v_target := v_target||v_temp2||psplitor; 
                         
                 v_srcstring := SUBSTR(v_srcstring,v_num_start+1);                                 
        end loop; 
         select dname    into v_temp2 from dept where deptno=to_number(v_srcstring); 
         v_target := v_target||v_temp2; 
    return(v_target); 
end fn_getnames_splitor;
功能写的很简陋,没有相应的捕捉异常等。
现在ptype 暂时无效。是个扩展功能参数。
select fn_getnames_splitor('10,20,30,40',',','dept') from dual;
 
执行结果:
ACCOUNTING,RESEARCH,SALES,OPERATIONS
 
 
 
个人感觉,应该还有更好的方法。好像可以使用oracle 10g 自带的正则表达式查询可以取得结果,而不用专门写个存储过程了。但本人的oracle 版本为9i. 希望以后又机会尝试一下。


本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/295864,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章