2012-04-26 70 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個特定列中,並將其他列保留爲空或我必須將其批量收集到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; 
+1

爲什麼不修改您的選擇爲'PROJECT_FINANCIAL'中的其餘13列選擇空值?這樣你就可以直接批量收集。 – Ollie 2012-04-26 14:41:34

回答

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聲明添加13個額外的NULL列。或者,如你所建議的,你可以將數據批量收集到兩個不同的集合中。