ORACLE에서 COLLECTION에 직접 DATA 읽어 오기 예제 입니다.
ORALCE의 TABLE FUNCTION을 통해, 동적으로 DATA를 RECORD로 반환 하는 방식이 가능해 진 이후, 이 방법을 자주 이용하고 있는데,
가끔 SELECT 된 RECORD를 TABLE TYPE으로 RETURN 하기 위해 객체에 DATA를 담을 때, LOOP를 돌려 DATA를 SET 하게 됩니다.
LOOP를 돌리지 않고 SELECT BULK COLLECT INTO 직접 DATA를 얻어 오는 방법 예제 입니다.
LOOP보다 속도 계선 및 노가다(키 입력 시간)을 줄일 수 있습니다….
참고 하셔요~~
SELECT BULK COLLECT INTO로 COLLECTION에 DATA 가져오기 예제
=====================================
1. OBJECT 생성
CREATE OR REPLACE TYPE NULL_TABLE AS OBJECT
(
COL_01 INTEGER,
COL_02 NUMBER,
COL_03 VARCHAR2(50),
COL_04 VARCHAR2(50),
COL_05 VARCHAR2(500)
)
2. OBJECT 배열형태의 생성
create or replace type t_null_table is table of null_table;
3. 셈플 소스
CREATE OR REPLACE FUNCTION FN_GET_COLLECTION_SELECT_TEST return T_NULL_TABLE
/*--------------------------------------------------------------------------*/
-- RECORD, OBJECT COLLECTION을 SELECT 하기 예제
-- Create By. smileBell , 2009-05-13
/*--------------------------------------------------------------------------*/
is
/* 내부 RECORD 선언 */
TYPE DELI_T IS RECORD
(
GUBUN VARCHAR(30),
ORDER_PRICE NUMBER
);
TYPE TBL_DELI_T IS TABLE OF DELI_T;
v_deli_t TBL_DELI_T;
/* 외부 OBJECT TYPE 사용 */
v_null_t T_NULL_TABLE;
v_null_t2 T_NULL_TABLE;
/* 동적 CURSOR 선언 */
cur sys_refcursor;
begin
/* RECORD로 하기 */
DBMS_OUTPUT.put_line('--RECORD로 하기');
SELECT ITEM_ID, unit_qty
bulk collect into v_deli_t
FROM ITEM
where rownum < 10;
for i in 1..v_deli_t.COUNT loop
DBMS_OUTPUT.put_line(v_deli_t(i).GUBUN || ':' || v_deli_t(i).ORDER_PRICE);
end loop;
/* 외부 TYPE */
DBMS_OUTPUT.put_line('--외부 TYPE');
SELECT null_table(ITEM_ID, unit_qty,NULL,NULL,NULL)
bulk collect INTO v_null_t
FROM ITEM P
where rownum < 10;
for i in 1..v_deli_t.COUNT loop
DBMS_OUTPUT.put_line(v_null_t(i).COL_01 || ':' || v_null_t(i).COL_02);
end loop;
/* 외부 TYPE에서 다시 읽어 오기 */
DBMS_OUTPUT.put_line('--외부 TYPE에서 다시 읽어 오기');
open cur FOR SELECT null_table(COL_01,COL_02,COL_03,COL_04,COL_05) FROM TABLE(v_null_t);
LOOP
FETCH cur BULK COLLECT INTO v_null_t2;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
for i in 1..v_null_t2.COUNT loop
DBMS_OUTPUT.put_line(v_null_t2(i).COL_01 || ':' || v_null_t2(i).COL_02);
end loop;
return(v_null_t2);
end;
4. TEST
select * from TABLE(FN_GET_COLLECTION_SELECT_TEST)