DATABASE(oracleDB 11g)/PLSQL

[PL/SQL]컬렉션 사용의 기초

SEUNGSAMI 2019. 2. 25. 10:27

컬렉션 사용의 기초



연관배열(INDEX BY 테이블)이란

- Primary Key(정수 or 문자열)와 scalar 또는 record 타입의 데이터가 있는 PL/SQL 컬렉션


다음과 같은 구문으로 연관배열을 생성한다.

1
2
3
4
5
6
7
TYPE type_name IS TABLE OF
    {column_type | variable%TYPE
    | table.column%TYPE} [NOT NULL]
    | table%ROWTYPE
    | INDEX BY PLS_INTEGER | BINARY_INTEGER
    | VARCHAR2(<size>);
identifier type_name;
cs


구문 

설명

type_name

테이블 유형의 이름

column_type

VARCHAR2, DATE, VARCHAR, NUMBER 또는 % TYPE과 같은 스칼라 또는 복합 데이터 유형

identifier

연관 배열을 나타내는 식별자의 이름



다음 예시를 참고하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DECLARE
    TYPE TYPE_DEPT IS RECORD
    (DEPTNO NUMBER(2),
     DNAME VARCHAR2(10)) ; -- 레코드 구조도 배열 생성 가능하다. + 뷰포함
 
    TYPE DEPT_TABLE_TYPE IS TABLE OF
    DEPARTMENTS%ROWTYPE INDEX BY PLS_INTEGER;
    
    DEPT_TABLE DEPT_TABLE_TYPE;
    
    CURSOR CUR_EMP IS
        SELECT EMPNO, ENAME, SAL, DEPTNO
        FROM EMP
        WHERE DEPTNO = 30;
        
BEGIN
    FOR REC_EMP IN CUR_EMP LOOP
        DBMS_OUTPUT.PUT_LINE(REC_EMP.ENAME);
    END LOOP;
 
    SELECT * BULK COLLECT INTO DEPT_TABLE -- BULK COLLECT INTO 를 이용해 한번에 여러 행을 가져온다.
    FROM DEPARTMENTS;                     -- INTO만 사용하면 한개의 행만 가져온다.
    
    
    FOR I IN DEPT_TABLE.FIRST .. DEPT_TABLE.LAST LOOP
        DBMS_OUTPUT.PUT_LINE(DEPT_TABLE(i).DEPARTMENT_NAME);
    END LOOP;
END;
/
cs



중첩테이블이란?

- 테이블 안에 테이블이 들어간 구조이다.

- 선언방법은 연관배열과 비슷하지만 IINDEX BY절이 존재하지 않는다.

- 관리차원에서 연관배열과 차이가 있는데 INDEX값을 우리가 조정할 수 없다.

- 값을 초기화 할때 타입의 이름과 ,(콤마)로 구분되는 하나의 값이 하나의 행으로 저장된다



다음 예시를 참고하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DECLARE
    TYPE TYPE_DEPT IS RECORD
    (DEPTNO NUMBER(2),
     DNAME VARCHAR2(10)) ; -- 레코드 구조도 배열 생성 가능하다. + 뷰포함
 
    TYPE DEPT_TABLE_TYPE IS TABLE OF
    DEPARTMENTS%ROWTYPE; --위의 예시와 달리 이곳에 INDEX BY절이 존개하지 않는다.
    
    DEPT_TABLE DEPT_TABLE_TYPE;
    
    CURSOR CUR_EMP IS
        SELECT EMPNO, ENAME, SAL, DEPTNO
        FROM EMP
        WHERE DEPTNO = 30;
        
BEGIN
    FOR REC_EMP IN CUR_EMP LOOP
        DBMS_OUTPUT.PUT_LINE(REC_EMP.ENAME);
    END LOOP;
 
    SELECT * BULK COLLECT INTO DEPT_TABLE -- BULK COLLECT INTO 를 이용해 한번에 여러 행을 가져온다.
    FROM DEPARTMENTS;                     -- INTO만 사용하면 한개의 행만 가져온다.
    
    
    FOR I IN DEPT_TABLE.FIRST .. DEPT_TABLE.LAST LOOP
        DBMS_OUTPUT.PUT_LINE(DEPT_TABLE(i).DEPARTMENT_NAME);
    END LOOP;
END;
/
cs



VARRY(가변 크기 배열)

#내용보충 필요







SQL을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.