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
先不考虑数据表设计的合理与否。
有两张表:一个是变更申请表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
相关文章推荐
- ibatis学习之--3、根据id查询对应的用户信息
- 百度地图API根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息
- mysql、oracle、sqlserver根据对应的表查询表中的所有字段名称、类型、别名、长度等信息
- linux下根据端口号查询对应进程
- 百度地图API之根据经纬度查询地址信息(Android)
- aspose.word根据word模板填充对应信息并导出
- Hibernate 根据实体名称得到DB表名以及表对应的Sequence name
- mysql 一个表内根据字段对应值不同查询统计总数
- 推荐:根据ISBN号查询图书信息的API - 豆瓣API
- 如何根据font的二进制信息快速得到是什么汉字--嵌入式
- PHP_SQL根据当前坐标查询5公里以内的信息
- 16进制ascii码转化为对应的字符,付ipmitool查询硬件信息
- Spring(13):新增功能(SqlSessionTemplate方案):超市订单的供应商表查询 and 根据供应商名称查询供应商信息--功能实现(上)
- 拆分列(ID的集合)的字符串,根据拆分结果查询所对应ID的名称
- C#开发ArcGIS Engine根据坐标提取对应区的属性(点选查询)
- B表中的pid对应A表中id,查询A表中数据,根据b表中对应a表中该id的数据数目排序
- C语言课程设计. 根据学号等信息查询学生成绩
- MYSQL中根据年份/月份/日期来查询相关信息
- C#根据字符串名称 得到对应的方法
- 根据反射将数据库查询结果Datatable,转换为对应的Model类实体对象