Oracle利用函数实现多行数据合并的效果
做了两天,终于把一个要的显示结果做出来了。。。
这里只是把我的学习过程总结一下,对那些需要的人提供帮助!
前提:
公司让我们新人陪服务端到手机端的xml文件,说白了就是ORM映射的原理,但是略有不同,需要手动的去写Oracle的脚本代码。其中有个字段需要把各个列的数据合并。
就是把上图中的YPTSFLMC的字段合并成一行,查过很对的资料,其中最简单用Oracle自带的wm_concat函数了,但是我查的数据太多了,用wm_concat函数做不出来,只能自己手写一个自定义函数。
首先先看一下代码:
1 /* Formatted on 2013-1-11 13:23:55 (QP5 v5.185.11230.41888) */ 2 CREATE OR REPLACE FUNCTION TypeStr (MEDCODE VARCHAR2) 3 RETURN VARCHAR2 4 AS 5 STR VARCHAR2 (1000); /*返回的数据集*/ 6 BEGIN 7 DECLARE 8 v_medCode VARCHAR2 (100); /*存放临时变量的地方*/ 9 10 CURSOR D_cursor 11 IS 12 SELECT T.STYPE_NAME 13 FROM HEALIDEA_MEDICINE_TYPE_SPECIAL T,HEALIDEA_MEDICINE_STYPE S 14 WHERE (S.MED_STYPE_CODE=T.STYPE_CODE) AND (S.MED_CODE=MEDCODE); 15 BEGIN 16 OPEN D_cursor; 17 loop 18 fetch D_cursor into v_medCode; 19 EXIT WHEN D_cursor%NOTFOUND; 20 if length(STR) > 0 THEN 21 STR := STR ||','|| v_medCode; 22 ELSE 23 STR := STR || v_medCode; 24 END IF; 25 END LOOP; 26 close D_cursor; 27 end; 28 RETURN STR; 29 END TypeStr;
函数的基本意思是根据MEDCODE来查询所有的单列结果集,在吧这个单列的结果集拼接起来做成一行。如果你看不懂的话,那先学习一下Oracle的基本语法吧,还有游标(其实我自己也是刚刚接触Oracle不到半个月,原本学习的是sql server,公司用的数据库是oracle,入公司随俗吧)。
小问题:
在测试的阶段,还是有出现了一个小问题,就是本来是显示两条数据的,现在用自己定义的函数,虽然把两个字段合并了,但是显示的数据还是两条。如图:
难道自己写了半天的函数就这么废掉了,幸好脑子机灵,想到了Oracle也有Distinct这个关键字。
结果:
这个就是我想要的数据了,哈哈成功的喜悦呀
本来也是刚刚接触Oracle不久,还有很多的问题也是和同事一起探讨中得到的答案。如果有什么不对,请指出,本人会及时改正!
Stallman 先生认为最大的快乐是让自己发展的软件让大家来使用了!