问题如下:

实际测试条件:

 
  
  1. --业务类别对应表 
  2. create table G_PRODUCT_REL 
  3.   PRODUCT_ID NUMBER not null--业务id 
  4.   PC_ID      NUMBER not null --业务类别id 
  5. SELECT 'INSERT INTO G_PRODUCT_REL(PRODUCT_ID,PC_ID)VALUES('||G.PRODUCT_ID||','||G.PC_ID||')' FROM G_PRODUCT_REL G; 

 
测试数据如下:


1

 
  
  1. SELECT G.PRODUCT_ID,strcat(G.PC_ID) FROM G_PRODUCT_REL G GROUP BY G.PRODUCT_ID; --每个业务属于哪些类别 

 

2

 
  
  1. SELECT PC_ID,STRCAT(G.PRODUCT_ID) FROM G_PRODUCT_REL G GROUP BY G.PC_ID; --每个类别下都有那些业务 



以下三个sql创建此函数:

 
  
  1. CREATE OR REPLACE FUNCTION strcat (input VARCHAR2) RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING strcat_type; 
  2. create or replace type strcat_type as object 
  3.       ( 
  4.         currentstr varchar2(4000), 
  5.         currentseprator varchar2(8), 
  6.         static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number, 
  7.         member function ODCIAggregateIterate(self IN OUT strcat_type,value IN VARCHAR2) return number, 
  8.         member function ODCIAggregateTerminate(self IN strcat_type,returnValue OUT VARCHAR2, flags IN number) return number, 
  9.         member function ODCIAggregateMerge(self IN OUT strcat_type,ctx2 IN strcat_type) return number 
  10.       ) 
  11. ❸ create or replace type body strcat_type is 
  12.       static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number is 
  13.       begin 
  14.         sctx := strcat_type('',','); 
  15.         return ODCIConst.Success; 
  16.       end
  17.       member function ODCIAggregateIterate(self IN OUT strcat_type, value IN VARCHAR2) return number is 
  18.       begin 
  19.         if self.currentstr is null then 
  20.            self.currentstr := value; 
  21.         else 
  22.           self.currentstr := self.currentstr ||currentseprator || value; 
  23.         end if; 
  24.         return ODCIConst.Success; 
  25.       end
  26.       member function ODCIAggregateTerminate(self IN strcat_type, returnValue OUT VARCHAR2, flags IN number) return number is 
  27.       begin 
  28.         returnValue := self.currentstr; 
  29.         return ODCIConst.Success; 
  30.       end
  31.       member function ODCIAggregateMerge(self IN OUT strcat_type, ctx2 IN strcat_type) return number is 
  32.       begin 
  33.         if ctx2.currentstr is null then 
  34.           self.currentstr := self.currentstr; 
  35.         elsif self.currentstr is null then 
  36.           self.currentstr := ctx2.currentstr; 
  37.         else 
  38.           self.currentstr := self.currentstr || currentseprator || ctx2.currentstr; 
  39.         end if; 
  40.         return ODCIConst.Success; 
  41.       end
  42.       end
以上的函数是我们的DBA写的,不过现在10g以上的数据库已经新增 wm_concat(column)函数实现字段合并了,哈哈