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つの変数(各列)に一括収集してそれらをループし、2つの列の値をコレクションg_project_financial_tableに取得する必要がありますか。

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;
4

2 に答える 2

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;
于 2012-04-26T18:54:37.930 に答える
0

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

于 2012-04-26T14:41:05.760 に答える