oracle中使用wm_concat函数的方法及弊端(解决办法)

该函数在10版本推出,可以把列值以英文逗号分隔起来并显示成一行,例子:
1.    SQL>  create   table  test(id number, name  varchar2(20));  
2.    SQL>  insert   into  test  values (1, 'a' );  
3.    SQL>  insert   into  test  values (1, 'b' );  
4.    SQL>  insert   into  test  values (1, 'c' );  
5.    SQL>  insert   into  test  values (2, 'd' );  
6.    SQL>  insert   into  test  values (2, 'e' );  
7.    SQL>  commit ;  
8.    效果 1 :  行转列   
9.    SQL>  select  wm_concat( name from  test;  
10.   WM_CONCAT( NAME )  
11.   -------------------------------------------------------------------------   
12.   a,b,c,d,e  
13.   效果 2:  把结果里的逗号替换成 "|"   
14.   SQL>  select   replace (wm_concat( name ), ',' , '|' from  test;  
15.   REPLACE (WM_CONCAT( NAME ), ',' , '|' )  
16.   -----------------------------------------------------------------------   
17.   a|b|c|d|e
我们经常用TO_CHAR 包含转换好的记录,这样可以正常展示成字符串( 因为在PL_SQL 中只用wm_concat 的话可能查出的是BLOB 字段)
以上参考地址:http://www.jb51.net/article/37604.htm

重点来了:wm_concat有长度限制或者版本不支持,为了解决这弊端,我们进行重新写一个函数代替
函数名暂且定位TO_STRING
CREATE OR REPLACE FUNCTION "TO_STRING" (table_in    in varchar2_table,
                           delimiter_in in varchar2 default ',')
   return varchar2 is
   v_idx pls_integer;
   v_str varchar2(32767);
   v_dlm varchar2(10);
 begin
   v_idx := table_in.first;
   while v_idx is not null loop
     v_str := v_str || v_dlm || table_in(v_idx);
     v_dlm := delimiter_in;
     v_idx := table_in.next(v_idx);
   end loop;
   return v_str;
 end to_string;
上面函数中有个varchar2_table,这个是我们建立在oracle的type
CREATE OR REPLACE TYPE "VARCHAR2_TABLE"  as table of varchar2(4000)

代替的用法如下:
select to_char(wm_concat(id))代替为:
select TO_STRING(cast(collect(to_char(id)) as varchar2_table))



你可能感兴趣的:(数据库)