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,不知这样是否会有影响先谢谢您 的指点!
http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?58864
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因为我这个查的是单子的审批记录人,在表中存的是一个单子有多条记录审批
现在是想把这个单子的多个审批人一行显示出来你的那个我看过了,写得好,我这个就是按你那个改的,之所以要改就是因为
我那个是多个单子,照果我每次根据一个单据号查那就直接是想要的结果,但是我想查的是所有的单的
请在给点指点,谢谢您
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>