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不久,还有很多的问题也是和同事一起探讨中得到的答案。如果有什么不对,请指出,本人会及时改正!

posted @ 2013-01-11 14:13  唯吴独尊  阅读(5416)  评论(0编辑  收藏  举报