1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (187)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (27)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
      • TIL (1)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] 컬렉션 메서드
📃 DATABASE/ORACLE

[PL/SQL] 컬렉션 메서드

2018. 2. 12. 00:00

컬렉션 메서드

컬렉션 메서드란 컬렉션의 요소에 접근해 값을 가져오고 수정,삭제하는 기능을 하는 빌트인 프로시저와 함수를 말한다.

컬렉션명.메서드명 형태로 사용할 수 있다.


 메서드명

메서드 타입 

설명 

 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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
cs



반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] 패키지(PACKAGE)  (1) 2018.02.19
[PL/SQL] 사용자 정의 타입  (2) 2018.02.12
[PL/SQL] 컬렉션(COLLECTION)  (1) 2018.02.11
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드  (0) 2018.02.10
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드  (0) 2018.02.08
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 패키지(PACKAGE)
    • [PL/SQL] 사용자 정의 타입
    • [PL/SQL] 컬렉션(COLLECTION)
    • [PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
    1HOON
    1HOON

    티스토리툴바