下面是我从baidu找到的一个帖子,和我目前遇到的问题相似,
请大家帮忙,求存储过程代码
表内容:   
    
  name         km         cj   
  张三         yw         81   
  张三         sx         82   
  张三         yy         83   
  张三         wl         84   
  张三         hx         85   
  李四         yw         71   
  李四         tt         72   
  李四         yt         73   
  李四         wl         74   
    
  其中   km   是动态的,可能还有dl,sw......     注:km中项目都是不重复的   希望得到结果:  
  name     yw   sx   yy   wl   hx   
  张三     81   82   83   84   85   
  李四     81   82   83   84   0   

解决方案 »

  1.   

    http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?1086
      

  2.   


    create or replace procedure row_to_col_func2(cur out sys_refcursor)
    as
      sqlstr varchar2(2000):='select name';
    begin
         for rs in (select distinct km from course ) loop
             sqlstr:=sqlstr||chr(10)||','||'max(decode(km,'''||rs.km||''',cj,0)) '||rs.km;
         end loop ;
         sqlstr:=sqlstr||chr(10)||'from course  group by name ' ;
         open cur for sqlstr;
    end row_to_col_func2;
      

  3.   

    给个例子吧
    第一类:如果K_NAME项目固定,使用DEOCDE函数
    with test as(
     select 3 USER_ID,'背景知识' K_NAME, 4.5 SCORE from dual union all
     select 3 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
     select 3 USER_ID,'服务意识' K_NAME, 1   SCORE from dual union all
     select 3 USER_ID,'沟通能力' K_NAME, 1   SCORE from dual union all
     select 4 USER_ID,'背景知识' K_NAME, 12  SCORE from dual union all
     select 4 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
     select 4 USER_ID,'服务意识' K_NAME, 0.5 SCORE from dual union all
     select 4 USER_ID,'沟通能力' K_NAME, 0.5 SCORE from dual)
    SELECT USER_ID,
           SUM(decode(K_NAME, '背景知识', SCORE)) "背景知识",
           SUM(decode(K_NAME, '创新能力', SCORE)) "创新能力",
           SUM(decode(K_NAME, '服务意识', SCORE)) "服务意识",
           SUM(decode(K_NAME, '沟通能力', SCORE)) "沟通能力"
      FROM test
    GROUP BY USER_ID; 
    第二类:如果项数不固定,使用存储过程动态SQL拼接
    表结构如下: 
    t_fl: 
    lb 
    ---- 




    e t_sj 
    id  lb  sl 
    ------------- 
    1  a  10 
    1  c  30 
    1  d  40 
    1  e  50 
    2  b  20 
    2  e  50 想弄出这样一个结果: 
    id  sl_a  sl_b  sl_c  sl_d  sl_e 
    --------------------------------- 
    1    10          30    40    50 
    2          20                50 --1、如果t_fl表行数据不定的话可以写一个存储过程
    CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
      sqlstr VARCHAR2(4000) := '';
    BEGIN
      FOR cc IN (SELECT lb FROM t_fl) LOOP
        sqlstr := sqlstr || 'sum(decode(lb,''' || cc.lb ||''',sl)) as "sl_' 
                         || cc.lb || '",';
      END LOOP;
      sqlstr := 'select id,' || rtrim(sqlstr,',') || ' from t_sj group by id';
      OPEN o FOR sqlstr;
    END row2col;
      

  4.   

    兄弟刚接触存储过程,所以有的代码看不大懂,
    麻烦按照我提供的信息帮我写一个可以直接用的存储过程,深表感谢!
    如果可以,马上结贴,100分一分不留
    信息如下:
    基础数据:
     
     单位名称     期间         项目        金额
       a      2011-01-31     xy       1000
       a      2011-01-31     xx        500
       a      2011-02-28     cc        700 
       a      2011-03-31     jj        400
      ...       ...         ...        ...实现效果:单位名称      期间         xy       xx     cc    jj   ...
       a       2011-01-31   1000    500     0     0
       a       2011-02-28    0      0      700    0
       a       2011-03-31    0      0       0    400注:项目下没有相同的项目,但项目数据量很多,至少百个,甚至上千!
      

  5.   

    补充:
    我在使用2楼代码的时候报错,提示如下:
    ORA-06502 PL/SQL数字或值错误:字符串缓冲区太小
    ORA-06512 在ROW_TO_COL_FUNC2,LINE6
    ORA-06512 在Line 3
    可能是由于项目太多了,但这些项目是必须要的,这样情况该怎么办