ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PL/SQL] 컬렉션(Collection) - 메소드
    IT, 프로그래밍/Database (Oracle) 2019. 1. 23. 16:20

     메소드명

    메소드 타입 

    설명 

     DELETE

    Procedure 

    컬렉션 요소 삭제 

     TRIM

    Procedure 

    VARRAY나 중첩 테이블의 끝에서 요소 삭제 

     EXTEND

    Procedure 

    VARRAY나 중첩 테이블의 끝에서 요소 추가 

     EXISTS

    Function 

    VARRAY나 중첩 테이블에 특정 요소가 존재하면 TRUE를 반환 

    FIRST

    Function 

     컬렉션의 첫 번째 인덱스를 반환

     LAST

    Function  

     컬렉션의 마지막 인덱스를 반환

     COUNT

    Function 

    컬렉션 요소의 총 수를 반환 

     LIMIT

    Function 

    컬렉션이 가질 수 있는 최대 요소의 수를 반환 

     PRIOR

    Function 

    특정 인덱스 직전의 인덱스를 반환 ( 어떤 요소의 바로 전에 있는) 

     NEXT

    Function 

    특정 인덱스 직후의 인덱스를 반환 ( 어떤 요소의 바로 앞에 있는 )



    컬렉션 메소드는 Collection명.메소드명 으로 접근한다.




    1. DELETE










    삭제 메소드는 컬렉션 별로 사용할 수 있는 범위가 다르니 유의 해야한다.


    메소드

    설명 

    연관배열 

    VARRAY 

    중첩 테이블 

     컬렉션.DELETE

     모든 원소 삭제 

    O

     컬렉션.DELETE(3)

     인덱스가 3인 요소 삭제

     컬렉션.DELETE(3,5)

     인덱스 3~5사이의 요소 삭제. 3, 4, 5 삭제함.



    왜 VARRAY는 중간에 있는 원소만 삭제가 안되는 것일까?


    VARRAY는 중간요소의 삭제가 불가하다. 자바의 ArrayList 처럼 중간 요소를 삭제하면 자동으로 인덱스가 한 칸씩 당겨지는 그런 구조가 아닌, 일반적인 배열의 정적인 성격을 가지고 있다. 


    그러므로 요소를 삭제하는것이 아니라, 다른 값으로 초기화를 시켜줘야 하는게 맞다.



    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 nt_typ IS TABLE OF VARCHAR2(10);
        vnt_test nt_typ;
    BEGIN
        vnt_test := nt_typ('FIRST''SECOND''THIRD');
     
        FOR i IN 1..3
    LOOP
        DBMS_OUTPUT.PUT_LINE(vnt_test(i));
    END LOOP;
    END;
     
    DECLARE
        TYPE av_type IS TABLE OF VARCHAR2(40) INDEX BY VARCHAR2(30);
        vav_test av_type;
    BEGIN
        vav_test('A') := '이것은 A';
        vav_test('B') := '이것은 B';
        vav_test('C') := '이것은 C';
     
        DBMS_OUTPUT.PUT_LINE(vav_test('A'));
        DBMS_OUTPUT.PUT_LINE(vav_test('B'));
        DBMS_OUTPUT.PUT_LINE(vav_test('C'));
     
        vav_test.DELETE();
      
        DBMS_OUTPUT.PUT_LINE(vav_test('A'));
     
      END;
    cs




    오류 보고 -

    ORA-01403: no data found

    ORA-06512: at line 15

    01403. 00000 -  "no data found"

    *Cause:    No data was found from the objects.

    *Action:   There was no data from the objects which may be due to end of fetch.

    이것은 A

    이것은 B

    이것은 C




    이와 같은 에러가 발생하는 이유는 삭제된 원소를 참조하려고 하기 때문이다.



    2. TRIM




    VARRAY나 중첩 테이블의 맨 끝에서 부터 매개변수로 넘긴 개수만큼 해당 요소를 삭제한다.

    매개변수로 2가 넘어오면 맨 끝에 있는 2개의 요소를 삭제한다.

    매개변수로 아무 것도 넘기지 않으면 기본값으로 맨 끝에 하나의 원소만 삭제한다.


    * 단 연관 배열의 경우 지원되지 않는다.




    1
    2
    3
    4
    5
    6
    BEGIN
    .....
        vnt_test := nt_typ('FIRST''SECOND''THRID''FOURTH''FIFTH');
        vnt_test.TRIM(2);
    .....
     
    cs


    이러면 FIRST, SECOND, THRID가 출력되며 뒤는 출력되지 않는다.


    연관배열의 경우,


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DECLARE
        TYPE av_type IS TABLE OF VARCHAR2(40) INDEX BY VARCHAR2(30);
        vav_test av_type;
    BEGIN
        vav_test('A') := '이것은 A';
        vav_test('B') := '이것은 B';
        vav_test('C') := '이것은 C';
     
        DBMS_OUTPUT.PUT_LINE(vav_test('A'));
        DBMS_OUTPUT.PUT_LINE(vav_test('B'));
        DBMS_OUTPUT.PUT_LINE(vav_test('C'));
     
        vav_test.TRIM(1);
     
        
      END;
    cs




    오류 보고 -

    ORA-06550: line 13, column 5:

    PLS-00306: wrong number or types of arguments in call to 'TRIM'

    ORA-06550: line 13, column 5:

    PL/SQL: Statement ignored


    부적절한 타입의 호출이라는 컴파일 에러가 발생한다.





    3. EXTEND 메소드






    VARRAY와 중첩 테이블의 맨 마지막에 NULL값을 추가한다.

    추가로 넘겨주는 인자값에 따라 특정 요소를 복사해서 추가할 수도 있다.


    EXTEND --> 해당 컬렉션에 맨 끝에 NULL인 요소 한 개 추가.

    EXTEND(n) --> 해당 컬렉션의 맨 끝에 값이 NULL인 요소를 n개 추가.

    EXTEND(n, i) --> 해당 컬렉션의 i번째에 있는 요소를 맨 끝에 n개 복사해 추가함.





    4. FIRST, LAST




    빌트인 함수로, 매개변수 없이 각각의 컬렉션의 첫 번째와 마지막 요소의 인덱스 반환함.

    만약 컬렉션이 비어 있다면 모두 NULL값을 리턴.

    요소개 1개 뿐이라면 모두 1을 리턴.


    Collection이름.FIRST

    Collection이름.LAST






    5. COUNT, LIMIT




    컬렉션의 요소 개수를 반환하는 메소드.

    COUNT는 현재 들어있는 요소의 수.

    LIMIT 메소드는 해당 컬렉션이 가질 수 있는 요소 최대 수를 반환.


    그러므로 VARRAY는 중간에 요소를 삭제할 수 없으므로 COUNT와 LIMIT가 항상 같다.


    연관배열과 중첩 테이블은 현재 요소는 알 수 있지만 추가할 수 있는 원소의 크기는 제한되어 있지 않으므로,

    LIMIT는 항상 NULL을 리턴한다.



    Collection이름.COUNT

    Collection이름.LIMIT


    * VARRAY -> COUNT = LIMIT

    * 연관배열, 중첩 테이블 -> COUNT = 현재 들어있는 원소 개수, LIMIT = NULL





    6. PRIOR, NEXT




    PRIOR은 현재 컬렉션 요소 사이에서 앞의 요소의 인덱스를 리턴한다..




    PRIOR의 경우, 만약 맨 첫 번째의 (FIRST) 의 요소의 인덱스를 받을경우, NULL을 리턴한다.

    왜냐하면 첫 번째 앞의 요소는 존재하지 않기 때문이다.

    위의 그림의 경우 Collection이름.PRIOR(3)을 했을 때 Collection(2)의 원소를 리턴한다.





    NEXT의 경우 전달 받은 인덱스의 바로 뒤에 있는 원소를 리턴한다.

    만약 맨 뒤의 원소 (LAST)의 요소의 인덱슬르 받은 경우 NULL을 리턴한다.


    Collection이름.PRIOR(num);

    Collection이름.NEXT(num);




    'IT, 프로그래밍 > Database (Oracle)' 카테고리의 다른 글

    [PL/SQL] 패키지(Package)  (0) 2019.01.25
    [PL/SQL] 컬렉션의 다양한 사용  (0) 2019.01.24
    [PL/SQL] 컬렉션(Collection) - 개념  (0) 2019.01.23
    [PL/SQL] 레코드 (Record)  (0) 2019.01.18
    [PL/SQL] 커서 (Cursor)  (0) 2019.01.17
Designed by Tistory.