Search results for 'Bulk'

  1. 2009.12.10 -- [Oracle] Bulk Collect

[Oracle] Bulk Collect

2009. 12. 10. 17:07
 
 



SELECT 문에서 한번에 대량의 레코드들 취득 하는 경우, BULK COLLECT구문을 사용하면

한번에 여러개의 레코드를 취득할수 있으므로 퍼포먼스 향상

 

Patten 1

-------------------------------------------------------------------------------

DECLARE
  TYPE empno_tbl_type IS TABLE OF EMP.EMPNO%TYPE INDEX BY BINARY_INTEGER;
  empno_tbl  empno_tbl_type;
BEGIN
  SELECT EMPNO BULK COLLECT INTO empno_tbl FROM EMP;
  IF empno_tbl.COUNT > 0 THEN
    FOR i IN empno_tbl.FIRST..empno_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = empno_tbl( i );
    END LOOP;
  END IF;
END;
/

 

Patten 2

-------------------------------------------------------------------------------

DECLARE
  TYPE emp_tbl_type IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tbl  emp_tbl_type;
BEGIN
  SELECT * BULK COLLECT INTO emp_tbl FROM EMP;
  IF emp_tbl.COUNT > 0 THEN
    FOR i IN emp_tbl.FIRST..emp_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = emp_tbl( i ).EMPNO;
    END LOOP;
  END IF;
END;
/

 

Patten 3 커서 이용

-------------------------------------------------------------------------------

DECLARE
  CURSOR emp_cur IS
    SELECT * FROM EMP;
  TYPE emp_tbl_type IS TABLE OF emp_cur%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tbl  emp_tbl_type;
BEGIN
  OPEN emp_cur;
  FETCH emp_cur BULK COLLECT INTO emp_tbl;
  CLOSE emp_cur;
  IF emp_tbl.COUNT > 0 THEN
    FOR i IN emp_tbl.FIRST..emp_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = emp_tbl( i ).EMPNO;
    END LOOP;
  END IF;
END;
/

 


pattern 4.

 

create table bc (
  a number, 
  b varchar2(10)
);
 
insert into bc values (11,'elf');
insert into bc values (12,'zwoelf');
insert into bc values (13,'dreizehn');
insert into bc values (14,'vierzehn');

commit;

 

declare
  type t_bc_a is table of bc.a%type;
  type t_bc_b is table of bc.b%type;
  v_str_query_se_1 varchar2(1000);
  l_bc_a t_bc_a;
  l_bc_b t_bc_b;
begin

  v_str_query_se_1:='select a, b from bc';

  EXECUTE IMMEDIATE v_str_query_se_1
  BULK COLLECT INTO l_bc_a, l_bc_b;
end;
/



,커서를 이용할시 취득할 데이터 수가 많을듯하면 Limit 사용하여 일정 레코드 단위로

Fetch하는 것이 성능면에서 좋다.

bulk collect 오라클 시스템에서

PL/SQL
처리하면서 사용하는 메모리를

많이 늘려 사용한다고 한다.


슈플 Oracle/Administration , , ,