2012-04-26 5 views
1
TYPE t_project_financial_table IS TABLE OF project_financial%ROWTYPE; 
g_project_financial_table t_project_financial_table; 

表project_financialには15の列があります。 select文は2列を返します。コレクションg_project_financial_tableの2つの特定の列に大量に収集し、他の列をnullのままにすることができますか?2つの列の値をコレクションg_project_financial_tableに取得するために2つのVARRAY(各列)コレクションの特定の列に一括収集

BULK COLLECT INTO g_project_financial_table.column3、g_project_financial_table.column8のようなものですか?

SELECT k.tag, 
    (SELECT pa.available 
    FROM pers_account pa 
    WHERE pa.valid_from = 
    (SELECT MAX(pa2.valid_from) 
     FROM pers_account pa2 
     WHERE pa2.valid_from <= k.tag)) AS available 

BULK COLLECT INTO g_project_financial_table ??????? 

FROM kalender k 
WHERE k.tag BETWEEN to_date('20120430','YYYYMMDD') 
       AND to_date('20120504','YYYYMMDD') 
    AND k.ist_werktag = 1 
ORDER BY k.tag; 
+1

なぜ、「PROJECT_FINANCIAL」の残りの13個の列に対してNULL値を選択するように修正しないのですか?そうすれば、コレクションに大量に直接収集することができます。 – Ollie

答えて

2

大規模な日付範囲では、各行に2つの追加クエリを実行するため、このクエリのパフォーマンスが問題になっていることはご存知でしょうか?

とにかく、私の解決策は、一括挿入したい場合は2つのコレクションに集めることです。 しかし、好意的には、膨大な数の行を挿入するようには見えないので、通常の挿入物を使用するのが最も簡単です。とにかく一括挿入があります。

create or replace procedure add_days_to_financial(p_date_from in date, p_date_to in date) 
as 
    cursor cur_kalender 
    is 
    SELECT k.tag, 
     (SELECT pa.available 
     FROM pers_account pa 
     WHERE pa.valid_from = 
     (SELECT MAX(pa2.valid_from) 
      FROM pers_account pa2 
      WHERE pa2.valid_from <= k.tag)) AS available 
    FROM kalender k 
    WHERE k.tag BETWEEN p_date_from and p_date_to 
     AND k.ist_werktag = 1 
    ORDER BY k.tag; 

    type t_tag is table of kalender.tag%type; 
    type t_available is table of kalender.available%type; 

    arr_tag t_tag; 
    arr_available t_available; 
begin 
    open cur_kalender; 
    loop 
     fetch cur_kalender bulk collect into arr_tag, arr_available limit 500; 

     forall i in arr_tag.first .. arr_tag.last 
      insert into project_financial 
      (tag, available) 
      values 
      (arr_tag(i), arr_available(i)); 

     commit; 
     exit when cur_kalender%notfound; 
    end loop; 

    close cur_kalender; 

    commit; 
exception 
    when others then 
     -- log? 
     raise; 
end; 
0

15列レコードのわずか2列にデータを収集することはできません。ただし、SELECTステートメントに適切な位置にNULL列を追加することもできます。または、提案したように、データを2つの異なるコレクションにまとめて収集することもできます。

関連する問題