상세 컨텐츠

본문 제목

ORACLE에서 COLLECTION에 직접 DATA 읽어 오기 예제 입니다.

프로그래밍/DB

by 라제폰 2009. 5. 15. 11:04

본문

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)


관련글 더보기