2009-07-07 4 views
2

전달한 ID를 기반으로 sys_refcursor를 반환하는 PL/SQL 패키지가 있습니다. 몇 가지 ID를 통해 반복하고 각 ID에 대해 반복되는 원래 결과 집합에서 한 열을 가진 새로운 참조 커서를 만들고 싶습니다. 나는이sys_refcursor 내에서 오라클 커서 사용

create or replace procedure test_refcur is 
    refCursorValue SYS_REFCURSOR; 
begin 
    dashboard_package.visits(refCursorValue,12345); 
    for cursrow in refCursorValue loop 
     dbms_output.put_line(cursrow.ytd_tot); 
    end loop; 
end test_refcur; 

작업 같은이 있다면 내 생각

create or replace package body dashboard_package is 

    procedure visits(RC in out sys_refcursor, IdNumber varchar2) as 
    BEGIN 

     OPEN RC FOR 


     select * 
    from (
     select cat, cat_order, subcat, label_text 
       , trim(to_char(sum(v.current_month),'9,999,999,999')) current_month 
       , trim(to_char(sum(v.ly_month),'9,999,999,999')) ly_month 
       , trim(to_char(sum(v.ytd_tot),'9,999,999,999')) ytd_tot 
       , trim(to_char(sum(v.lytd_tot),'9,999,999,999')) lytd_tot 
       , trim(to_char(sum(v.ly_tot),'9,999,999,999')) ly_tot 
      from dashboard v 
     where v.id_number = IdNumber 
     group by cat_order, subcat, cat, label_text 

      union all 
      ... 
      ) a 

    order by cat_order, subcat; 

     END; 
END; 

나는까지 갈 수 :처럼 (. 크로스 탭의 정렬)을 PL/SQL 블록의 매우 단순화 된 버전은 보인다 거기 ... 어떤 생각? 아니면 제가 묻고있는 질문에 대한 설명을 해줄 수도 있습니다.

답변

3

ID가 많은 경우 첫 번째 경품은 하나의 SQL 쿼리 만 실행하여 ID에 대량 인 바인드를 사용하여 한 번에 로트를 가져 오는 것입니다. 이 경우 dashboard_package.visits을 수정하거나 단일 ID 대신 PL/SQL 테이블을 허용하는 visits 프로 시저의 새 버전을 작성해야합니다. 손이 dashboard_package을 수정 WRT를 연결하는 경우

, 당신은 ID의 집합에 대한 행을 반환하는 파이프 라인 기능을 작성할 수

-- create some helper types for the pipelined function 
create type visitobj as object 
(id    number 
,cat   dashboard.cat%type 
,cat_order  dashboard.cat_order%type 
,subcat   dashboard.subcat%type 
,label_text  dashboard.label_text%type 
,current_month varchar2(13) 
,ly_month  varchar2(13) 
,ytd_tot  varchar2(13) 
,lytd_tot  varchar2(13) 
,ly_tot   varchar2(13)); 
create type visittable as table of visitobj; 

create or replace function test_refcur 
    return visittable deterministic pipelined is 
    refCursorValue SYS_REFCURSOR; 
    cat   dashboard.cat%type; 
    cat_order  dashboard.cat_order%type; 
    subcat   dashboard.subcat%type; 
    label_text  dashboard.label_text%type; 
    current_month varchar2(13); 
    ly_month  varchar2(13); 
    ytd_tot  varchar2(13); 
    lytd_tot  varchar2(13); 
    ly_tot   varchar2(13); 
begin 
    for id in (/*iterate through the IDs*/) loop 
    dashboard_package.visits(refCursorValue, id); 
    loop 
     fetch refCursorValue into cat, cat_order, subcat, label_text, 
           current_month, ly_month, ytd_tot, 
           lytd_tot, ly_tot; 
     exit when refCursorValue%NOTFOUND; 
     pipe row (visitobj (id, cat, cat_order, subcat, label_text, 
          current_month, ly_month, ytd_tot, 
          lytd_tot, ly_tot)); 
    end loop; 
    end loop; 
    return; 
end test_refcur; 

-- now you can simply do this: 
SELECT * FROM TABLE(test_refcur); 

("/*iterate through the IDs*/"물론 당신이 원하는 방법이 될 것입니다 함수가 호출되어야하는 ID (예 : ID의 PL/SQL 테이블 또는 다른 쿼리 일 수 있음)를 수집하는 데 사용합니다.

다시 한번 "첫 번째 상금"은이 추가 작업을 전혀하지 않는 것입니다. 단지 하나의 SQL에서이 모든 것을 수행하는 dashboard_package.visits 만 있으면됩니다.

참고로 trim(to_char(sum(v.ly_tot),'9,999,999,999'))to_char(sum(v.ly_tot),'FM9,999,999,999')으로 간략화 할 수 있습니다. 또한 형식이 'FM9G999G999G999' 인 경우에는 로케일별로 다릅니다.

+0

FM9G999G999G999에 대한 정보를 제공해 주셔서 감사합니다. 파이프 라인 기능을 지금보고 있습니다. – Lloyd