Oracle 行转列----存储过程

欢迎技术交流。 QQ:138986722

原文地址--http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?39758

--行转列过程
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',  --选用的聚合函数,可选,默认为max
                                       colorder        in varchar2 default null,   --行转列后列的排序,可选
                                       roworder        in varchar2 default null,   --行转列后记录的排序,可选
                                       when_value_null in varchar2 default '0',   --若value_col字段的值聚合后为空,则转换成该值,可选
                                       viewname        in varchar2 default 'v_tmp' --创建的视图名称,可选,默认为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;
/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值