CREATE OR REPLACE PACKAGE BODY pkg_test
AS
    function row_to_col_func(when_value_null in varchar2 default null
                                  )return sys_refcursor
as
  sqlstr varchar2(2000):='select distinct prsqdh,wzid,wzmc,wzggxh,wzcz,wzjldw,prdpzsl,prbmmc,prsqr ';
  v1 varchar2(100);
  dh varchar2(200);
  cur sys_refcursor;
  type prsqdh_collect is table of view_rowtocol.prsqdh%type index by binary_integer;
  prsqdh_collection prsqdh_collect;
  type qzry_collect is table of view_rowtocol.qzry%type index by binary_integer;
  qzry_collection qzry_collect;
begin     select distinct prsqdh bulk collect into prsqdh_collection from view_rowtocol order by prsqdh;
     for i in 1..prsqdh_collection.count loop
       dh:=prsqdh_collection(i);
       select distinct qzry bulk collect into qzry_collection from view_rowtocol where prsqdh=''||dh||'';
       for j in 1..qzry_collection.count loop 
       v1:=qzry_collection(j);
       sqlstr:=sqlstr||chr(10)||','||'max(decode(to_char(qzry),'''||v1||''',qzry,'''||v1||''')) 审批人';
       end loop;
       open cur for sqlstr||' from view_rowtocol where prsqdh='||dh||' group by --这里有问题prsqdh,qzry,wzid,wzmc,wzggxh,wzcz,wzjldw,prdpzsl,prbmmc,prsqr  order by prsqdh' ;
       --准备在这里存入临时表(临时表名temp_CGRequest)
       --cur游标,返回的结果集
     sqlstr :='select distinct prsqdh,wzid,wzmc,wzggxh,wzcz,wzjldw,prdpzsl,prbmmc,prsqr ';
     end loop ;
  return cur;
end row_to_col_func;
END pkg_test;
我用了两个循环目的是想实现这样的效果
表结构如:
表名 :t_1
单号 签字人 意见
001 A a
001 B b
 . . .
 . . .
 . . .
002 A a
 . . .
 . . .
 . . .想要得到的结果:
单号 签字人 意见 签字人 意见 ... 签字人 意见
001 A a B b C c  
002 A a B b C c  
上面可以实现 ,但是我是在第二for循环中得到的cur(游标),到最后出来了结果就是结果集里显示的是最后一次循环的值
我想把每一次循环得到的游标中的结果集合并成一个结果集,整了半天了,也没想出法子,只能采取临时表的办法,把每一次的先存到临时表中,请大家给写点代码,临时表已创建好temp_CGRequest这里还有一个问题就是结果集中签字人有可能有2个,4个,6个,我建的临时表给了个最大值9,不知这样是否会有影响先谢谢您 的指点!

解决方案 »

  1.   

    另外不用写那么多cursor,参考
    http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?58864
      

  2.   

    我按照你这个得到的结果是
          2009  a 0 0
          2009  0 b 0
          2009  0 0 c
          2008  a 0 0
          2008  0 b 0
          2008  0 0 c我想改成这样的       2009  a b c
          2008  a b c因为我这个查的是单子的审批记录人,在表中存的是一个单子有多条记录审批
    现在是想把这个单子的多个审批人一行显示出来你的那个我看过了,写得好,我这个就是按你那个改的,之所以要改就是因为
    我那个是多个单子,照果我每次根据一个单据号查那就直接是想要的结果,但是我想查的是所有的单的
    请在给点指点,谢谢您 
      

  3.   

    Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
    SQL> set linesize 30000
    SQL> select * from tab;DH     HQR    YJ
    ------ ------ ------
    001    A      a
    001    B      b
    001    C      c
    002    A      a
    002    B      b
    002    C      c6 rows selected.SQL> edit
    Wrote file afiedt.buf  1  create or replace procedure row_to_col_func(cur out sys_refcursor)
      2  as
      3    sqlstr varchar2(2000):='select dh';
      4  begin
      5       for rs in (select distinct hqr,yj from tab ) loop
      6         sqlstr:=sqlstr||chr(10)||','||'max(decode(to_char(hqr),'''||rs.hqr||''',hqr,'''')) 审批人';
      7         sqlstr:=sqlstr||chr(10)||','||'max(decode(to_char(yj),'''||rs.yj||''',yj,'''')) 意见';
      8       end loop ;
      9       sqlstr:=sqlstr||chr(10)||'from tab  group by dh ' ;
     10       open cur for sqlstr;
     11* end row_to_col_func;
     12  /Procedure created.SQL> 
    SQL> var cur refcursor
    SQL> exec row_to_col_func(:cur);PL/SQL procedure successfully completed.SQL> print curDH     审批人 意见   审批人 意见   审批人 意见
    ------ ------ ------ ------ ------ ------ ------
    001    A      a      B      b      C      c
    002    A      a      B      b      C      cSQL> delete from tab where dh='001' and hqr='C';1 row deleted.SQL> commit;Commit complete.SQL> select * from tab;DH     HQR    YJ
    ------ ------ ------
    001    A      a
    001    B      b
    002    A      a
    002    B      b
    002    C      cSQL> exec row_to_col_func(:cur);PL/SQL procedure successfully completed.SQL> print curDH     审批人 意见   审批人 意见   审批人 意见
    ------ ------ ------ ------ ------ ------ ------
    001    A      a      B      b
    002    A      a      B      b      C      cSQL>