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 개의 열을 반환합니다. 컬렉션 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 열만으로 데이터를 수집 할 수 없습니다. 그러나 적절한 위치에 13 개의 추가 NULL 열을 SELECT 문에 추가 할 수 있습니다. 또는 제안한대로 데이터를 두 개의 다른 콜렉션으로 대량 수집 할 수 있습니다.

관련 문제