您的位置:首页 > 其它

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

2010-04-15 22:11 190 查看
需求是这样子的。
先不考虑数据表设计的合理与否。

有两张表:一个是变更申请表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. 希望以后又机会尝试一下。
希望大家批评指正本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/295864
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐