2009-07-07 16 views
2

私はあなたが渡したIDに基づいてsys_refcursorを返すPL/SQLパッケージを持っています。私はいくつかのidsを繰り返し、各idに対して繰り返される元の結果セットから1列の新しいrefカーソルを作成したいと思います。 (クロスタブの並び替え)PL/SQLブロックの非常に単純化されたバージョンは、次のようになります。sys_refcursor内のoracleカーソルを使用

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; 

私は私が働いてこの

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; 

のようなものを持っていた場合、私からそれを取ることができると思いますそこに...どんな考え?あるいは、私が尋ねるはずの質問についての解明かもしれません。

答えて

3

多数のIDを取得する場合は、1つのSQLクエリのみを実行してIDのバルクインバインドを使用して1回でロットを取得することが最優先です。これには、おそらくdashboard_package.visitsを変更するか、単一のIDの代わりに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テーブル、またはおそらく別のクエリ)。

「最初の賞」は、この余分な作業を一切行わないことです.1つの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

関連する問題