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,如需转载请自行联系原作者
相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
56 2
|
2月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
218 1
|
2月前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
53 2
|
2月前
|
SQL Oracle 关系型数据库
Oracle之如何将表数据生成一个分隔列表
Oracle之如何将表数据生成一个分隔列表
44 1
|
SQL Oracle 关系型数据库
Oracle 数据库sql语句修改表字段的字段类型和长度
Oracle 数据库sql语句修改表字段的字段类型和长度
388 0
Oracle 数据库sql语句修改表字段的字段类型和长度
|
关系型数据库 MySQL
mysql查询字段包含英文的记录
mysql查询字段包含英文的记录
301 0
|
SQL 数据库
SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
一、实例介绍 SQL语句大小写到底是否区分呢?我们先从下面的这个例子来看一下: 例: --> 创建表,插入数据: declare @maco table (number int,myvalue varchar(2)) insert into @maco select 1,'aa' ...
1396 0