2012-04-26 3 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 столбца. Могу ли я набирать объем в 2 конкретных столбцах коллекции g_project_financial_table и оставлять остальные столбцы нулевыми или я должен набирать объем в 2 varrays (для каждого столбца) и перебирать их, чтобы получить значения двух столбцов в коллекции 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; 
+1

Почему вы не изменяете свой выбор, чтобы выбрать нулевые значения для остальных 13 столбцов в 'PROJECT_FINANCIAL'? Таким образом, вы можете напрямую собирать сбор в коллекцию. – 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

Вы не можете собрать данные только в 2 столбцах из 15 столбцов. Однако вы можете добавить 13 дополнительных столбцов NULL в соответствующие позиции в свой оператор SELECT. Или, как вы предположили, вы можете собирать данные в две разные коллекции.

Смежные вопросы