ORACLE行转列通用过程

create or replace procedure row_to_col(tabname in varchar2,

                                   group_col  in  varchar2,
                                   column_col  in  varchar2,
                                   value_col  in  varchar2,
                                   Aggregate_func  in  varchar2  default  'max' ,
                                   colorder  in  varchar2  default  null ,
                                   roworder  in  varchar2  default  null ,
                                   when_value_null  in  varchar2  default  null ,
                                   viewname  in  varchar2  default  'v_tmp' )
Authid  Current_User
as
   sqlstr varchar2(2000):= 'create or replace view ' ||viewname|| ' as select ' ||group_col|| ' ' ;
   c1 sys_refcursor;
   v1 varchar2(100);
begin
   open  c1  for  'select distinct ' ||column_col|| ' from ' ||tabname|| case  when  colorder  is  not  null  then  ' order by ' ||colorder  end ;
   loop
     fetch  c1  into  v1;
     exit  when  c1%notfound;
     sqlstr:=sqlstr||chr(10)|| ',' || case  when  when_value_null  is  not  null  then  'nvl('  end ||
       Aggregate_func|| '(decode(to_char(' ||column_col|| '),' '' ||v1|| '' ',' ||value_col|| '))' ||
       case  when  when_value_null  is  not  null  then  chr(44) ||when_value_null||chr(41)  end || '"' ||v1|| '"' ;
   end  loop;
   close  c1;
   sqlstr:=sqlstr|| ' from ' ||tabname|| ' group by ' ||group_col|| case  when  roworder  is  not  null  then  ' order by ' ||roworder  end ;
   execute  immediate sqlstr;
end  row_to_col;
 
这里修改了传入参数名,使其更容易理解。继续使用了创建视图这个方法,当然也可以改成用游标传出。
参数:
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。
 

你可能感兴趣的:(oracle)