컬렉션 메서드
컬렉션 메서드란 컬렉션의 요소에 접근해 값을 가져오고 수정,삭제하는 기능을 하는 빌트인 프로시저와 함수를 말한다.
컬렉션명.메서드명 형태로 사용할 수 있다.
메서드명 |
메서드 타입 |
설명 |
DELETE |
프로시저 |
컬렉션 요소를 삭제 |
TRIM |
프로시저 |
VARRAY나 중첩테이블의 끝에서 요소를 삭제 |
EXTEND |
프로시저 |
VARRAY나 중첩테이블의 끝에 요소를 추가 |
EXISTS |
함수 |
VARRAY나 중첩테이블에 특정 요소가 존재하면 TRUE를 반환 |
FIRST |
함수 |
컬렉션의 첫번째 인덱스를 반환 |
LAST |
함수 |
컬렉션의 마지막 인덱스를 반환 |
COUNT |
함수 |
컬렉션의 요소의 총 갯수를 반환 |
LIMIT |
함수 |
컬렉션이 가질 수 있는 요소의 최대 수를 반환 |
PRIOR |
함수 |
특정 인덱스 이전의 인덱스를 반환 |
NEXT |
함수 |
특정 인덱스 다음의 인덱스를 반환 |
DELETE 메서드
컬렉션 요소를 삭제하는 빌트인 프로시저로, 삭제할 요소의 인덱스를 매개변수로 받는다.
매개변수를 생략하면 요소 전체를 삭제하며, (FROM, TO) 형태로 2개의 매개변수를 넘기면 그 범위 안에 속한 모든 요소를 제거한다.
VARRAY의 경우, 중간에 요소가 빠질 수 없는 특징이 있어 매개변수를 넘길 수 없다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | DECLARE TYPE AV_TYPE IS TABLE OF VARCHAR2(40) INDEX BY VARCHAR2(10); VAV_TEST AV_TYPE; VN_CNT NUMBER := 0; BEGIN VAV_TEST('A') := '10에 대한 값'; VAV_TEST('B') := '20에 대한 값'; VAV_TEST('C') := '20에 대한 값'; VN_CNT := VAV_TEST.COUNT; DBMS_OUTPUT.PUT_LINE('삭제 전 요소의 개수 : ' || VN_CNT); -- DELETE 메서드로 요소 두 개 제거 VAV_TEST.DELETE('A', 'B'); VN_CNT := VAV_TEST.COUNT; DBMS_OUTPUT.PUT_LINE('삭제 후 요소의 개수 : ' || VN_CNT); END; | cs |
TRIM 메서드
TRIM 메서드는 VARRAY나 중첩 테이블의 맨 끝에서부터 매개변수로 넘긴 갯수만큼 해당 요소를 제거한다.
매개변수를 넘기지 않으면 맨 끝의 요소 하나만 제거한다.
만약, 해당 컬렉션의 크기가 0이거나 매개변수에 해당하는 요소가 존재하지 않으면 ORA-06533 : SUBSCRIPT_BEYOND_COUNT 예외가 발생한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | DECLARE TYPE NT_TYPE IS TABLE OF VARCHAR2(10); VNT_TEST NT_TYPE; BEGIN VNT_TEST := NT_TYPE('FIRST', 'SECOND', 'THIRD', 'FOURTH', 'FIFTH'); VNT_TEST.TRIM(2); DBMS_OUTPUT.PUT_LINE(VNT_TEST(1)); DBMS_OUTPUT.PUT_LINE(VNT_TEST(2)); DBMS_OUTPUT.PUT_LINE(VNT_TEST(3)); DBMS_OUTPUT.PUT_LINE(VNT_TEST(4)); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); END; | cs |
EXTEND 메서드
EXTEND 메서드는 TRIM과 반대로 VARRAY와 중첩 테이블의 끝에 요소를 추가한다.
매개변수를 넘기지 않으면 맨 끝에 NULL 요소를 하나 추가하고, 매개변수를 EXTEND(N) 형태로 넘기면 맨 끝에 값이 NULL인 요소를 N개 추가한다.
매개변수를 EXTEND(N, I) 형태로 넘기면 컬렉션의 I번째 요소를 N개만큼 맨끝에 복사해 추가한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | DECLARE TYPE NT_TYPE IS TABLE OF VARCHAR2(10); VNT_TEST NT_TYPE; BEGIN VNT_TEST := NT_TYPE('FIRST', 'SECOND', 'THIRD'); VNT_TEST.EXTEND; VNT_TEST(4) := 'FOURTH'; DBMS_OUTPUT.PUT_LINE(VNT_TEST(4)); VNT_TEST.EXTEND(2, 1); DBMS_OUTPUT.PUT_LINE('첫번째 : ' || VNT_TEST(1)); DBMS_OUTPUT.PUT_LINE('추가한 요소1 : ' || VNT_TEST(5)); DBMS_OUTPUT.PUT_LINE('추가한 요소2 : ' || VNT_TEST(6)); END; | cs |
FIRST와 LAST 메서드
FIRST와 LAST 메서드는 빌트인 함수로, 매개변수 없이 각각 컬렉션의 첫번째와 마지막 요소의 인덱스를 반환한다.
만약 컬렉션이 비어있다면 두 함수 모두 NULL을, 요소가 1개 뿐이라면 두 함수 모두 1을 반환한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE TYPE NT_TYPE IS TABLE OF VARCHAR2(10); VNT_TEST NT_TYPE; BEGIN VNT_TEST := NT_TYPE('FIRST', 'SECOND', 'THIRD', 'FOURTH', 'FIFTH'); FOR i IN VNT_TEST.FIRST..VNT_TEST.LAST LOOP DBMS_OUTPUT.PUT_LINE(i || '번째 요소의 값 : ' || VNT_TEST(i)); END LOOP; END; | cs |
COUNT와 LIMIT 메서드
COUNT는 컬렉션의 요소 갯수를 반환한다. VARRAY는 요소 일부를 삭제할 수 없으므로 COUNT와 LAST의 반환 값이 동일하다.
LIMIT는 해당 컬렉션이 가질 수 있는 요소의 최대 수를 반환하는데, 컬렉션이 요소의 최대수를 가질 수 없다면 NULL을 반환한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | DECLARE TYPE NT_TYPE IS TABLE OF VARCHAR2(10); TYPE VA_TYPE IS VARRAY(5) OF VARCHAR2(10); VNT_TEST NT_TYPE; VVA_TEST VA_TYPE; BEGIN VNT_TEST := NT_TYPE('FIRST', 'SECOND', 'THIRD', 'FOURTH'); VVA_TEST := VA_TYPE('첫번째', '두번째', '세번째', '네번째'); DBMS_OUTPUT.PUT_LINE('VARRAY COUNT : ' || VVA_TEST.COUNT); DBMS_OUTPUT.PUT_LINE('중첩테이블 COUNT : ' || VNT_TEST.COUNT); DBMS_OUTPUT.PUT_LINE('VARRAY LIMIT : ' || VVA_TEST.LIMIT); DBMS_OUTPUT.PUT_LINE('중첩테이블 LIMIT : ' || VNT_TEST.LIMIT); END; | cs |
PRIOR와 NEXT 메서드
PRIOR와 NEXT는 컬렉션 요소 사이에서 각각 앞 뒤로 이동하는 기능을 수행하고 매개변수로 요소의 인덱스를 받는다.
만약 현재 요소의 앞이나 뒤에 다른 요소가 없다면 NULL을 반환한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE TYPE VA_TYPE IS VARRAY(5) OF VARCHAR2(10); VVA_TEST VA_TYPE; BEGIN VVA_TEST := VA_TYPE('첫번째', '두번째', '세번째', '네번째'); DBMS_OUTPUT.PUT_LINE('FIRST의 PRIOR : ' || VVA_TEST.PRIOR(VVA_TEST.FIRST)); DBMS_OUTPUT.PUT_LINE('LAST의 NEXT : ' || VVA_TEST.NEXT(VVA_TEST.LAST)); DBMS_OUTPUT.PUT_LINE('인덱스3의 PRIOR : ' || VVA_TEST.PRIOR(3)); DBMS_OUTPUT.PUT_LINE('인덱스3의 NEXT : ' || VVA_TEST.NEXT(3)); END; | cs |
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 패키지(PACKAGE) (1) | 2018.02.19 |
---|---|
[PL/SQL] 사용자 정의 타입 (2) | 2018.02.12 |
[PL/SQL] 컬렉션(COLLECTION) (0) | 2018.02.11 |
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드 (0) | 2018.02.10 |
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드 (0) | 2018.02.08 |