-
[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
O
O
컬렉션.DELETE(3)
인덱스가 3인 요소 삭제
O
X
O
컬렉션.DELETE(3,5)
인덱스 3~5사이의 요소 삭제. 3, 4, 5 삭제함.
O
X
O
왜 VARRAY는 중간에 있는 원소만 삭제가 안되는 것일까?
VARRAY는 중간요소의 삭제가 불가하다. 자바의 ArrayList 처럼 중간 요소를 삭제하면 자동으로 인덱스가 한 칸씩 당겨지는 그런 구조가 아닌, 일반적인 배열의 정적인 성격을 가지고 있다.
그러므로 요소를 삭제하는것이 아니라, 다른 값으로 초기화를 시켜줘야 하는게 맞다.
1234567891011121314151617181920212223242526272829DECLARETYPE nt_typ IS TABLE OF VARCHAR2(10);vnt_test nt_typ;BEGINvnt_test := nt_typ('FIRST', 'SECOND', 'THIRD');FOR i IN 1..3LOOPDBMS_OUTPUT.PUT_LINE(vnt_test(i));END LOOP;END;DECLARETYPE av_type IS TABLE OF VARCHAR2(40) INDEX BY VARCHAR2(30);vav_test av_type;BEGINvav_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개의 요소를 삭제한다.
매개변수로 아무 것도 넘기지 않으면 기본값으로 맨 끝에 하나의 원소만 삭제한다.
* 단 연관 배열의 경우 지원되지 않는다.
123456BEGIN.....vnt_test := nt_typ('FIRST', 'SECOND', 'THRID', 'FOURTH', 'FIFTH');vnt_test.TRIM(2);.....cs 이러면 FIRST, SECOND, THRID가 출력되며 뒤는 출력되지 않는다.
연관배열의 경우,
12345678910111213141516DECLARETYPE av_type IS TABLE OF VARCHAR2(40) INDEX BY VARCHAR2(30);vav_test av_type;BEGINvav_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