有一个数据表,其中的一个字段比较长,是由多个属性组成,例如:


SQL 
  > 
    
  select 
   code_string,项目名称,code_value  
  from 
   code_standard;

CODE_STRING          项目名称                       CODE_VALUE

oracle中猜分字符串成多个字段_table


-- ------------------ ------------------------------ --------------------------------------------------------------------------------

oracle中猜分字符串成多个字段_table


210403006011          螺母                           物料大分类码段,标准件,203|标准件分类码段,紧固件,204|紧固件分类码段,螺母,215|标准代号码段,GB/T6178-1986,530|规格码段,M20,1371|材料(强度等级)码段,8,1718|表面处理码段,氧化,506

oracle中猜分字符串成多个字段_table


第三个字段非常的长,希望猜分成 这样:


oracle中猜分字符串成多个字段_table


1,创建一个 split 函数


create     
  or 
    
  replace 
   type type_split  
  as 
    
  table 
    
  of 
    
  varchar2 
  ( 
  50 
  );   
  -- 
  创建一个  type  ,如果为了使split函数具有通用性,请将其size 设大些。 
  
   

   -- 
  创建function 
  
   create 
    
  or 
    
  replace 
    
  function 
   split
(
   p_list    varchar2 
  ,
   p_sep    varchar2 
   : 
  = 
    
  ' 
  , 
  ' 
  
)     return 
   type_split pipelined
    is 
  
   l_idx  pls_integer;
   v_list     varchar2 
  ( 
  50 
  ) : 
  = 
   p_list;
   begin 
  
   loop
      l_idx :   = 
   instr(v_list,p_sep);
         if 
   l_idx  
  > 
    
  0 
    
  then 
  
             pipe 
   row(substr(v_list, 
  1 
  ,l_idx 
  - 
  1 
  ));
          v_list :   = 
   substr(v_list,l_idx 
  + 
  length(p_sep));
         else 
  
             pipe 
   row(v_list);
             exit 
  ;
         end 
    
  if 
  ;
      end 
   loop;
      return 
  ;
   end 
   split;

2,创建主函数


--   --创建类型   
   create     
  or 
    
  replace 
   type m_type  
  is 
   object(a  
  varchar2 
  ( 
  50 
  ),b  
  varchar2 
  ( 
  50 
  ),c  
  varchar2 
  ( 
  50 
  ),d  
  varchar2 
  ( 
  50 
  ),e  
  varchar2 
  ( 
  50 
  ),f  
  varchar2 
  ( 
  50 
  ),g  
  varchar2 
  ( 
  50 
  ),h  
  varchar2 
  ( 
  50 
  ),k varchar2(50))


   create     
  or 
    
  replace 
   type m_table  
  is 
    
  table 
     
  of 
   m_type



   --   ---创建function 
  
   create     
  or 
    
  replace 
    
  function 
   getCodeData  
  return 
   m_table
       as   
        cursor    ca  
  is 
    
  select 
   code_string  
  as 
   item_code,项目名称  
  as 
   item_name,code_value  
  from 
   code_standard;
     rs ca   %   rowtype;   
     rs2 m_table:   =   m_table();   
     
     type cursor_type    is    ref  
  cursor 
  ;
     type record_type    is    record(
        a    varchar2   ( 
  50 
  )       
     );
     
     c1 cursor_type;
     r_c1 record_type;
     
     c2 cursor_type;
     r_c2 record_type;
      
     TYPE  type_arrry    IS     
  TABLE 
    
  OF 
    
  VARCHAR2 
  ( 
  50 
  );
     myArray type_arrry:   =   type_arrry();
      
     mysql    varchar2   ( 
  500 
  );
     
     i    integer   : 
  = 
  0 
  ;
     m    integer   ;
     n    integer   ;
 
        begin   
     
         n:   =   1 
  ;
         m:   =   1 
  ;
         myArray.extend(   10   );
            open    ca;
         loop
               fetch    ca  
  into 
   rs;
               exit     
  when 
   ca 
  % 
  notfound;
            
            rs2.extend(   1   );

            myArray(   1   ): 
  = 
  rs.item_code;
            myArray(   2   ): 
  = 
  rs.item_name;
            i:   =   3 
  ;
            mysql:   =   ' 
  select * from table(split( 
  ''' 
  || 
   rs.code_value  
  || 
  ''' 
  , 
  '' 
  | 
  '' 
  )) 
  ' 
  ;
               open    c1  
  for 
   mysql;
            loop
                 fetch    c1  
  into 
   r_c1;
                 exit     
  when 
   c1 
  % 
  notfound;      
              mysql:   =   ' 
  select * from table(split( 
  ''' 
    
  || 
   r_c1.a  
  || 
    
  ''' 
  , 
  '' 
  , 
  '' 
  )) 
  ' 
  ;
              n:   =   1 
  ;
                 open    c2  
  for 
   mysql;
              loop
                    fetch    c2  
  into 
   r_c2;
                    exit     
  when 
   c2 
  % 
  notfound;
                      if    n 
  = 
  2 
    
  then 
  
                          --   myArray.extend(1); 
  
                          myArray(i):   = 
  r_c2.a;
                      end     
  if 
  ;
                   n:   =   n 
  + 
  1 
  ;
                 end    loop; 
                 close    c2;   
              i:   =   i 
  + 
  1 
  ;    
               end    loop;
               close    c1;  
            rs2(m):   =   m_type(myArray( 
  1 
  ),myArray( 
  2 
  ),myArray( 
  3 
  ),myArray( 
  4 
  ),myArray( 
  5 
  ),myArray( 
  6 
  ),myArray( 
  7 
  ),myArray( 
  8 
  ),myArray(9));
            m:   =   m 
  + 
  1 
  ;         
            end    loop;
            close    ca;
         
            return    rs2;
      end   ;
 
3,测试
 
   
SQL   >       select 
    
  * 
    
  from 
    
  table 
  (getcodedata)  
  where 
   rownum 
  < 
  10 
  ;

A                                                  B                                                  C                                                  D                                                  E                                                  F                                                  G                                                  H                                                  K
   --   ------------------------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------   
   210403006011                                          螺母                                               标准件                                             紧固件                                             螺母                                               GB   / 
  T6178 
  - 
  1986 
                                        M20                                                 
  8 
                                                    氧化
   210401001022                                          螺母                                               标准件                                             紧固件                                             螺母                                               GB   / 
  T6181 
  - 
  1986 
                                        M8                                                  
  04 
                                                   不经处理
   210504004012                                          垫圈                                               标准件                                             紧固件                                             垫圈                                               GB   / 
  T853 
  - 
  1988 
                                          
  8 
                                                    Q215                                               不经处理
   210113026011                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T37 
  - 
  1988 
                                          M10 
  * 
  40 
                                                
  8.8 
                                                  氧化
   210113002013                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T37 
  - 
  1988 
                                          M12 
  * 
  45 
                                                
  8.8 
                                                  镀铬
   210113017011                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T37 
  - 
  1988 
                                          M6 
  * 
  30 
                                                 
  8.8 
                                                  氧化
   210113005011                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T37 
  - 
  1988 
                                          M8 
  * 
  65 
                                                 
  8.8 
                                                  氧化
   210111009012                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T5780 
  - 
  2000 
                                        M20 
  * 
  110 
                                               
  4.8 
                                                  不经处理
   210107053012                                          螺栓                                               标准件                                             紧固件                                             螺栓                                               GB   / 
  T5781 
  - 
  2000 
                                        M10 
  * 
  25 
                                                
  4.8 
                                                  不经处理

   9    rows selected

SQL   >