컬렉션 사용의 기초
연관배열(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을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.
'DATABASE(oracleDB 11g) > PLSQL' 카테고리의 다른 글
[PL/SQL]혼합, DDL, DB 이벤트 트리거(TRIGGER) 생성 (0) | 2019.02.25 |
---|---|
[PL/SQL]트리거의 기초 (0) | 2019.02.25 |
[PL/SQL]코드 설계 고려 사항 기초 (0) | 2019.02.22 |
[PL/SQL]동적 SQL의 기초 (0) | 2019.02.22 |
[PL/SQL]패키지 작업의 기초 (0) | 2019.02.22 |