1. DELETE
컬렉션의 요소를 삭제하는 프로시저.
변수명.DELETE : 모든 요소 삭제
변수명.DELETE(n) : 인덱스가 n인 요소 삭제
변수명.DELETE(n, m) : 인덱스가 n ~ m인 요소 삭제
DECLARE
TYPE T_NUM_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
NUM_ARRAY T_NUM_ARRAY;
BEGIN
FOR i IN 1..5 LOOP
NUM_ARRAY(i) := i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('NUM_ARRAY 출력 (삭제 전)');
FOR i IN 1..NUM_ARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(i));
END LOOP;
NUM_ARRAY.DELETE(3);
DBMS_OUTPUT.PUT_LINE('NUM_ARRAY 출력 (삭제 후)');
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(1));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(2));
-- DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(3));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(4));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(5));
END;

* 주의
가변 길이 배열(VARRAY)는 모든 요소를 삭제하는 DELETE 이외에는 사용할 수 없다. 즉, 인덱스를 지정하여 중간에 있는 특정 요소만 삭제하는 것이 불가능하다.
또한 모든 컬렉션은 삭제한 요소의 인덱스에 대해 참조할 수 없다. 즉 인덱스가 3인 요소를 DELETE로 삭제한 후에는 인덱스 3을 참조할 수 없다.
DECLARE
TYPE T_NUM_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
NUM_ARRAY T_NUM_ARRAY;
BEGIN
FOR i IN 1..5 LOOP
NUM_ARRAY(i) := i;
END LOOP;
NUM_ARRAY.DELETE(3);
DBMS_OUTPUT.PUT_LINE('NUM_ARRAY 출력 (삭제 후)');
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(1));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(2));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(3)); -- 에러 발생
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(4));
DBMS_OUTPUT.PUT_LINE(NUM_ARRAY(5));
END;

2. TRIM
VARRAY나 중첩 테이블의 맨 끝에서부터 지정한 개수만큼의 요소를 삭제하는 프로시저. 매개변수가 지정되지 않을 경우 기본값으로 맨 끝의 1개 요소만 삭제한다.
단, 연관 배열에서는 사용할 수 없다. 마찬가지로 TRIM으로 제거된 요소의 인덱스는 참조할 수 없다.
변수명.TRIM : 배열 맨 끝의 요소 1개 삭제
변수명.TRIM(n) : 배열 맨 끝부터 요소 n개 삭제
DECLARE
TYPE T_NUM_VARRAY IS VARRAY(5) OF NUMBER;
NUM_VARRAY T_NUM_VARRAY;
BEGIN
NUM_VARRAY := T_NUM_VARRAY(1, 2, 3, 4, 5);
DBMS_OUTPUT.PUT_LINE('NUM_VARRAY 출력 (TRIM 전)');
FOR i IN 1..NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_VARRAY(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------');
NUM_VARRAY.TRIM();
DBMS_OUTPUT.PUT_LINE('NUM_VARRAY 출력 (TRIM 후)');
FOR i IN 1..NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_VARRAY(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------');
NUM_VARRAY.TRIM(2);
DBMS_OUTPUT.PUT_LINE('NUM_VARRAY 출력 (TRIM 후; 매개변수 : 2)');
FOR i IN 1..NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_VARRAY(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------');
END;
3. EXTEND
VARRAY와 중첩 테이블의 맨 마지막에 NULL값을 추가하는 프로시저. 넘겨주는 매개변수 값에 따라 특정 요소를 복사해 추가할 수도 있다.
단, VARRAY는 EXTEND를 사용해도 앞서 선언한 최대 크기를 초과할 수 없다.
변수명.EXTEND : 배열 맨 끝에 값이 NULL인 요소 1개 추가
변수명.EXTEND(n) : 배열 맨 끝에 값이 NULL인 요소 n개 추가
변수명.EXTEND(n, i) : 배열 맨 끝에 인덱스가 i인 요소의 값을 복사한 요소 n개 추가
DECLARE
TYPE T_NUM_VARRAY IS VARRAY(5) OF NUMBER;
NUM_VARRAY T_NUM_VARRAY;
BEGIN
NUM_VARRAY := T_NUM_VARRAY(1, 2, 3, 4);
DBMS_OUTPUT.PUT_LINE('NUM_VARRAY 출력 (EXTEND 전)');
FOR i IN 1..NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_VARRAY(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------');
NUM_VARRAY.EXTEND(1, 1);
DBMS_OUTPUT.PUT_LINE('NUM_VARRAY 출력 (EXTEND 후)');
FOR i IN 1..NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(NUM_VARRAY(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------');
END;
4. EXISTS
특정 인덱스의 요소에 값이 들어있는지 확인하고 값이 있을 경우 true, 없을 경우 false를 반환하는 함수. NULL 값의 경우 false를 반환하지만 빈 문자열의 경우 true를 반환한다.
변수명.EXISTS(n) : n번 인덱스의 요소에 값이 있으면 true, 없으면 false
DECLARE
TYPE T_STR_VARRAY IS VARRAY(5) OF VARCHAR2(100);
STR_VARRAY T_STR_VARRAY;
BEGIN
STR_VARRAY := T_STR_VARRAY('APPLE', 'BANANA', 'GRAPE', '');
FOR i IN 1..5 LOOP
IF STR_VARRAY.EXISTS(i) THEN
DBMS_OUTPUT.PUT_LINE(i || '번 인덱스 값 있음');
ELSE
DBMS_OUTPUT.PUT_LINE(i || '번 인덱스 값 없음');
END IF;
END LOOP;
END;

5. FIRST, LAST
컬렉션의 첫 번째, 마지막 번째 요소의 인덱스를 반환하는 함수. 컬렉션이 비어있을 경우 NULL, 요소가 1개 뿐일 경우 1을 반환한다.
변수명.FIRST : 컬렉션의 첫 번째 인덱스를 반환
변수명.LAST : 컬렉션의 마지막 번째 인덱스를 반환
DECLARE
TYPE T_STR_VARRAY IS VARRAY(5) OF VARCHAR2(100);
STR_VARRAY T_STR_VARRAY;
BEGIN
STR_VARRAY := T_STR_VARRAY('APPLE', 'BANANA', 'GRAPE', '');
DBMS_OUTPUT.PUT_LINE('첫 번째 인덱스 : ' || STR_VARRAY.FIRST);
DBMS_OUTPUT.PUT_LINE('마지막 번째 인덱스 : ' || STR_VARRAY.LAST);
END;
6. COUNT, LIMIT
컬렉션의 요소 개수와 컬렉션이 가질 수 있는 최대 요소 개수를 반환한다. 연관 배열과 중첩 테이블은 최대 크기를 정의하지 않으므로 LIMIT은 항상 NULL을 반환한다.
변수명.COUNT : 요소 개수 반환
변수명.LIMIT : 저장 가능한 최대 요소 개수 반환
DECLARE
TYPE T_STR_VARRAY IS VARRAY(5) OF VARCHAR2(100);
STR_VARRAY T_STR_VARRAY;
BEGIN
STR_VARRAY := T_STR_VARRAY('APPLE', 'BANANA', 'GRAPE', '');
DBMS_OUTPUT.PUT_LINE('컬렉션 요소 개수 : ' || STR_VARRAY.COUNT);
DBMS_OUTPUT.PUT_LINE('컬렉션 요소 최대 개수 : ' || STR_VARRAY.LIMIT);
END;

7. PRIOR, NEXT
컬렉션에서 현재 인덱스의 앞, 뒤 요소의 인덱스를 반환한다. 즉. 현재 인덱스가 5라면 PRIOR는 4, NEXT는 6을 반환한다.
변수명.PRIOR(n) : 인덱스 n인 요소의 이전 요소의 인덱스를 반환
변수명.NEXT(n) : 인덱스 n인 요소의 다음 요소의 인덱스를 반환
DECLARE
TYPE T_STR_VARRAY IS VARRAY(5) OF VARCHAR2(100);
STR_VARRAY T_STR_VARRAY;
BEGIN
STR_VARRAY := T_STR_VARRAY('APPLE', 'BANANA', 'GRAPE', '');
DBMS_OUTPUT.PUT_LINE('PRIOR(2) : ' || STR_VARRAY.PRIOR(2));
DBMS_OUTPUT.PUT_LINE('NEXT(2) : ' || STR_VARRAY.NEXT(2));
END;

'데이터베이스 > Oracle' 카테고리의 다른 글
| [PL/SQL] 레코드 (Record) (0) | 2023.07.13 |
|---|---|
| [PL/SQL] 컬렉션 (Collection) (0) | 2023.07.13 |
| [PL/SQL] BULK COLLECT INTO (0) | 2023.07.11 |
| [PL/SQL] 동적쿼리 (EXECUTE IMMEDIATE) (0) | 2023.07.11 |
| [OracleDB] 두 개의 테이블에서 조인 조건으로 사용할 수 있는 컬럼을 가져오는 함수 (0) | 2023.06.15 |