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 字段)

重点来了: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))



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值