pl sql collections nested table
코드 예제를 통해 PL SQL 컬렉션, 컬렉션 메서드, Varray, 중첩 테이블 및 연관 배열의 기본 사항을 학습합니다.
에서 PL / SQL 하위 프로그램 튜토리얼 PL / SQL 시리즈 에서는 프로 시저 및 함수, 다양한 매개 변수 전달 방법, PL / SQL에서 프로 시저 및 함수를 생성 / 삭제하는 방법에 대해 배웠습니다.
이 기사에서는 PL SQL 컬렉션 및 관련 개념에 대해 설명합니다. 또한 PL / SQL에서 사용할 수있는 Varray, 중첩 테이블 및 인덱스 별 테이블의 개념에 대해서도 설명합니다.
게다가, 우리는 내장 된 컬렉션 예외와 컬렉션 방법을 살펴볼 것입니다.
학습 내용 :
PL SQL 컬렉션
콜렉션은 동종 데이터 유형의 요소 그룹입니다. 일반적으로 배열, 목록, 집합 등으로 구성됩니다. 각 요소에는 위치를 반영하는 특정 첨자가 있습니다.
PL SQL 콜렉션의 유형은 다음과 같습니다.
- 연관 배열 / 인덱스 별 테이블
- 중첩 테이블.
- Varrays.
PL SQL 컬렉션은 일반적으로 Oracle에서 BULK COLLECT 키워드를 사용하여 큰 데이터 청크의 저장 및 조작에 사용됩니다.
수집 방법
Pl / SQL에는 아래에 나열된 컬렉션 아래에 몇 가지 기본 제공 메서드가 있습니다.
Sl. 아니. | 이름 | 설명 |
---|---|---|
7 | 다음 (m) | m 번째 인덱스에 이은 인덱스를 제공합니다. |
1 | 카운트 | 컬렉션에있는 요소의 수를 제공합니다. |
두 | 한도 | 컬렉션 크기를 확인합니다. |
삼 | 존재 (m) | 컬렉션에있는 m 번째 요소가 false를 반환하면 true를 반환합니다. |
4 | 먼저 | 정수 첨자로 컬렉션의 시작 인덱스 번호를 제공합니다. |
5 | 마지막 | 정수 첨자와 함께 컬렉션의 끝 인덱스 번호를 제공합니다. |
6 | 넓히다 | 컬렉션 끝에 NULL 요소를 추가합니다. |
8 | 이전 (m) | m 인덱스 앞에 오는 인덱스를 제공합니다. |
9 | 손질 | 컬렉션의 끝에서 요소를 삭제합니다. |
10 | 트림 (m) | 컬렉션 끝에서 m 개의 요소를 삭제합니다. |
열한 | 지우다 | 컬렉션에서 모든 요소를 삭제하고 개수를 0으로 설정합니다. |
12 | 삭제 (m) | 컬렉션에서 m 번째 요소를 삭제합니다. m 번째 요소가 NULL이면 아무 작업도 수행되지 않습니다. |
13 | 삭제 (m, k) | m 번째부터 k 번째 위치까지 요소를 삭제합니다. |
14 | 연장 (m) | 컬렉션 끝에 m 요소를 추가합니다. |
열 다섯 | 연장 (m, k) | 컬렉션의 끝에 k 번째 요소의 m 개 사본을 추가합니다. |
수집 예외
일반적인 컬렉션 예외 중 일부는 다음과 같습니다.
- VALUE_ERROR : 이 예외는 아래 첨자를 키 유형으로 변환 할 수 없거나 NULL 인 경우에 발생합니다. 이 예외는 키가 PLS_INTEGER 범위 유형이고 아래 첨자가이 범위를 벗어난 경우 일반적으로 발생합니다.
- 데이터가 없습니다: 이 예외는 SELECT 문이 행을 가져 오지 않거나 프로그램이 중첩 된 테이블에서 삭제 된 요소를 가리키는 경우 PL / SQL에서 발생합니다. 이 예외는 인덱스 기준 테이블에서 초기화되지 않은 요소에 의해 발생할 수도 있습니다.
- COLLECTION_IS_NULL : 이 예외는 콜렉션이 기본적으로 NULL 인 경우 PL / SQL에서 발생합니다.
- SUBSCRIPT_BEYOND_COUNT : 이 예외는 아래 첨자가 컬렉션에있는 요소의 총 개수보다 많을 때 발생합니다.
- SUBSCRIPT_OUTSIDE_LIMIT : 이 예외는 아래 첨자가 임계 값 범위를 벗어날 때 발생합니다.
PL / SQL의 중첩 테이블
중첩 테이블은 단일 열 데이터베이스 테이블 또는 배열 크기가 동적 인 1 차원 배열과 같습니다. 아래 첨자는 숫자 유형입니다. 행에 1로 시작하는 첨자를 제공하여 중첩 된 테이블을 변수로 가져올 수 있습니다.이 기능은 본질적으로 배열과 유사하게 만듭니다.
중첩 테이블은 데이터베이스의 열에 보관할 수 있습니다. 또한 테이블을 결합하여 SQL 작업을 조작하는 데 사용할 수도 있습니다. 동적 배열과 같기 때문에 상한값은 모든 크기가 될 수 있습니다.
중첩 테이블은 DELETE 프로 시저를 사용하여 임의의 요소를 임의로 삭제할 수 있음을 의미하는 조밀 및 희소 컬렉션 특성을 모두 가질 수 있습니다. 데이터를 삭제하면 인덱스에 불연속성이 발생하지만 NEXT 함수는 다음 첨자로 반복하는 데 도움이됩니다. 데이터는 테이블 형태로 저장되므로 SELECT 문을 사용하여 검색 할 수 있습니다.
중첩 테이블은 스키마 수준이나 PL / SQL 블록에서 만들 수 있습니다. 이는 데이터베이스 또는 하위 프로그램 내에서 액세스 할 수있는 데이터베이스 개체와 같습니다.
배열 테이블과 중첩 테이블의 차이점은 다음과 같습니다.
- 중첩 테이블의 크기를 동적으로 늘릴 수 있습니다. 배열의 상한은 고정되어 있지만 중첩 테이블에 대해서는 고정되어 있지 않습니다.
- 배열에는 조밀하게 만드는 연속 첨자가 있습니다. 그러나 중첩 테이블은 생성시 조밀하지만 그 사이에 요소가 삭제되면 희소 화됩니다.
중첩 테이블의 구문 :
TYPE <> IS TABLE OF <> (NOT NULL);
여기, '유형' 유형 지정자입니다. '요소' 데이터 유형입니다.
중첩 테이블을 사용한 코드 구현 :
DECLARE TYPE subject IS TABLE OF VARCHAR(15); TYPE teacher IS TABLE OF VARCHAR2(20); subjectnames subject; subjectteacher teacher; summ integer; BEGIN -- adding subject and its teachers to the table subjectnames := subject('PLSQL', 'SELENIUM', 'JMETER'); subjectteacher:= teacher('Sashi', 'Mala', 'Mukund'); -- returns count of number of elements in nested table summ:= subjectteacher.count; -- printing the content to the console dbms_output.put_line('Total Number of Teachers: '|| summ); FOR i IN 1 .. summ LOOP dbms_output.put_line('Subject:'||subjectnames(i)||', Teacher:' || subjectteacher(i)); end loop; END;
위 코드의 출력은 다음과 같아야합니다.
연관 배열 또는 인덱스 별 테이블
index-by 테이블을 일반적으로 연관 배열이라고합니다. 구조 측면에서 인덱스 별 테이블과 중첩 테이블은 모두 유사하며 요소에 액세스하기위한 첨자가 있습니다.
연관 배열은 키-값 쌍으로 표시됩니다. 각 고유 키는 배열의 값을 식별하는 데 사용됩니다. 키의 데이터 유형은 생성하는 동안 정의 된 문자열 또는 정수일 수 있습니다. 처음으로 값을 할당하기 만하면 index-by 테이블에 키가 추가됩니다. 동일한 항목을 수정하려면 동일한 키를 사용해야합니다.
키는 테이블의 기본 키로 또는 문자열을 함께 결합하여 고유 한 값을 개발하는 고유 한 키 여야합니다. 이 유형의 컬렉션에는 동적 배열 크기가 있으며 희소 또는 조밀 특성이 있습니다. 인덱스 별 테이블과 중첩 테이블의 한 가지 차이점은 전자는 데이터베이스의 열에 저장할 수 없지만 중첩 테이블은 저장할 수 있다는 것입니다.
연관 배열은 첨자를 쉽게 유지 관리하며 PL / SQL 블록 내에서 생성됩니다. 기본 키를 사용하여 값을 얻는 SQL 테이블과 같습니다. 이는 일반적으로 임시 데이터 저장에 사용되며 SQL 테이블에 필요한 네트워크 트래픽 및 디스크 저장을 방지하기 위해 SQL 테이블 대신 사용할 수 있습니다.
연관 배열은 영구 데이터를 저장하지 않으므로 SELECT 및 INSERT와 같은 SQL 문과 함께 사용할 수 없습니다. 그러나 데이터 유형을 패키지로 선언하고 패키지 본문 내부에 정의하여 데이터베이스 세션 동안 끝이 나지 않게 만들 수 있습니다.
index-by 테이블의 구문 :
TYPE type IS TABLE OF element (NOT NULL) INDEX BY (BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size)); INDEX BY key;
여기, '키' 숫자입니다. BINARY_INTEGER 또는 PLS_INTEGER 일 수 있습니다. 데이터 유형은 varchar, varchar2, long 또는 string 일 수 있습니다. varchar 기반 키는 길이와 함께 언급되어야합니다.
'요소' 데이터 유형입니다.
'크기' 최대 요소 수입니다. 양의 정수입니다.
'유형' 유형 지정자입니다.
index-by 테이블을 사용한 코드 구현 :
DECLARE TYPE age IS TABLE OF NUMBER INDEX BY VARCHAR(25); age_empl age; employee VARCHAR(25); BEGIN -- adding employee details to the table age_empl('Sam') := 30; age_empl('Venu') := 35; -- printing the table contents in the console employee := age_empl.FIRST; WHILE employee IS NOT null LOOP dbms_output.put_line ('Employee name is ' || employee || ' and age is ' || TO_CHAR(age_empl(employee))); employee := age_empl.NEXT(employee); END LOOP; END; /
위 코드의 출력은 다음과 같아야합니다.
PL / SQL의 Varray
Varray는 고정 된 수의 요소를 저장하며 1 차원 배열과 같습니다. 그러나 요소 수는 런타임에 수정할 수 있습니다. 유사한 데이터 유형의 연속 요소 집합입니다. SQL 문을 사용하여 처리 할 수있는 데이터베이스 테이블에 저장할 수 있습니다. 그러나 프로세스는 중첩 테이블 에서처럼 쉽고 유연하지 않습니다.
Varray의 최대 크기는 유형 정의에 정의되어 있습니다. 1 개의 첨자로 시작하는 메모리 배열이 하나씩 있고 가장 낮은 위치 주소는 시작 요소를 가리키고 가장 높은 위치 주소는 끝 요소를 가리 킵니다. Varray의 모든 요소는 인덱스로 식별됩니다.
이 유형의 콜렉션에는 숫자 아래 첨자가 있으며 밀도가 높은 특성이 있습니다. 따라서 배열 요소는 그 사이에서 삭제할 수 없습니다. 전체 Varray를 삭제하거나 끝을 잘라낼 수 있습니다. 밀도가 높기 때문에 사용 유연성이 떨어집니다.
Varray는 PL / SQL 블록 내에서 또는 스키마 수준에서 생성 할 수 있습니다. 데이터베이스 또는 하위 프로그램 내에서 액세스 할 수있는 데이터베이스 개체로 처리됩니다. Varray는 배열의 크기를 알고있을 때 더 자주 사용됩니다. 사용하기 전에 초기화해야하며 생성자의 도움으로 초기화 할 수 있습니다. 선언 된 값은 NULL이며 요소를 참조하기 전에 초기화해야합니다.
Varray의 구문 :
TYPE <> IS VARYING ARRAY (<>) OF <> (NOT NULL);
여기,
'유형' 유형 지정자입니다.
'요소' 데이터 유형입니다.
'크기' 배열의 최대 요소 수입니다. 양의 정수입니다.
Varray 변수 선언 및 초기화
Varray를 생성 한 후 아래에 설명 된 방식으로 선언 할 수 있습니다.
통사론:
name type_n (:= type_n(...));
여기,
'이름' Varray 이름입니다.
‘type_n’ Varray의 유형입니다.
‘type_n (…)’ Varray 유형의 생성자입니다. 인수 목록은 쉼표 구분 기호 및 Varray 유형으로 언급됩니다.
Varray 변수를 사용하기 전에 초기화해야합니다. 그렇지 않으면 초기화되지 않은 수집 오류가 발생합니다. 초기화는 아래에 설명 된 방식으로 수행됩니다.
통사론:
name type_n := type_n();
0 요소로 변수를 초기화합니다. varray 변수의 요소를 채우려면 구문은 다음과 같습니다.
name type_n := type_n(e1, e2, ...);
Varray의 요소에 액세스
요소는 아래에 설명 된 프로세스를 통해 액세스 할 수 있습니다.
이름 (m); 여기서 m은 1로 시작하고 Varray 유형의 요소 수의 최대 개수로 끝나는 요소 인덱스입니다. m이 1의 범위를 초과하고 요소 수의 최대 개수를 초과하는 경우, SUBSCRIPT_BEYOND_COUNT PL / SQL에서 예외가 발생했습니다.
Varray의 크기는 ALTER 문을 사용하여 수정할 수 있습니다.
ALTER를 사용한 코드 구현.
CREATE Or REPLACE TYPE names AS VARRAY(2) OF VARCHAR(5); /
위 코드의 출력은 다음과 같아야합니다.
자바 기본 인터뷰 질문 및 답변
Varray를 사용한 코드 구현 :
DECLARE type countrynames IS VARRAY(3) OF VARCHAR2(50); type currency IS VARRAY(3) OF VARCHAR2(15); country countrynames; cur currency; addition integer; BEGIN -- adding country and its currency to the table country := countrynames('INDIA', 'USA', 'UK'); cur:= currency('INR', 'DOLLAR', 'POUND'); -- returns count of number of countries in varray addition := country.count; -- printing the content to the console dbms_output.put_line('Total Number of countries : '|| addition); FOR i in 1 .. addition LOOP dbms_output.put_line('Country: ' || country(i) || ' ,Currency : ' || cur(i)); END LOOP; END; /
위 코드의 출력은 다음과 같아야합니다.
Varray와 중첩 테이블의 차이점
차이점은 다음과 같습니다.
- 요소의 수를 알고 순차적으로 배열하는 시나리오를 작업하는 동안 일반적으로 Varray가 사용됩니다. 데이터베이스에 저장된 Varray는 첨자와 시퀀스를 유지합니다. 항상 단일 개체로 유지됩니다. 반면, 중첩 테이블은 요소 개수가 제한되지 않을 때 사용됩니다.
- 중첩 테이블에는 항상 끝이 아닌 모든 위치에서 요소를 제거 할 수있는 희소 특성이 있습니다. 중첩 테이블의 순서 및 아래 첨자는 데이터베이스에 저장 될 때 유지되지 않습니다. Varray의 요소는 항상 순서대로 유지됩니다.
연관 배열과 중첩 테이블의 차이점
차이점은 다음과 같습니다.
- 중첩 테이블은 데이터베이스의 열에 저장할 수 있지만 연관 배열은 저장할 수 없습니다. 중첩 테이블은 지속적으로 저장되는 적절한 데이터 관계를 유지합니다.
- 연관 배열은 패키지가 초기화되거나 프로 시저가 호출 될 때마다 컬렉션이 메모리에 빌드 될 수있는 작은 조회 테이블에 적합합니다. 크기를 미리 알 수없는 경우 좋은 선택입니다. 연관 배열의 인덱스 값은이 배열의 첨자가 순서가 아니거나 숫자 대신 음수 또는 문자열 일 수 있으므로 유연합니다.
자주 묻는 질문과 답변
Q # 1) PL / SQL에서 컬렉션을 사용하는 이유는 무엇입니까?
대답: 컬렉션에는 중첩 테이블, 연관 배열 및 Varray의 세 가지 유형이 있습니다. 중첩 테이블은 임의의 수의 요소를 저장할 수 있습니다. Varray는 고정 된 수의 요소를 저장할 수 있으며 연관 배열을 사용하면 임의의 숫자와 문자열로 요소를 검색 할 수 있습니다.
Q # 2) PL / SQL의 중첩 테이블은 무엇입니까?
대답: 중첩 테이블은 본질적으로 1 차원이며 크기는 고정 된 상태로 유지되지 않습니다. SQL 및 PL / SQL 블록에서 액세스 할 수 있습니다. 레코드, 개체 정의 및 테이블에서 사용할 수 있습니다.
Q # 3) Oracle PL / SQL의 대량 수집이란 무엇입니까?
대답: 대량 수집은 PL / SQL 엔진이 SQL 엔진에 한 번에 여러 행을 누적하고이를 수집에 저장하도록 알릴 때 데이터를 가져 오는 방법입니다.
Q # 4) Oracle에서 대량 수집이 더 빠른 이유는 무엇입니까?
대답: 대량 수집은 PL / SQL 엔진과 데이터베이스 간의 상호 작용을 줄여 성능을 향상시킵니다.
Q # 5) PL / SQL에서 Varray는 무엇입니까?
대답: 동일한 데이터 유형의 요소의 동종 컬렉션을 시퀀스에 저장하는 데 사용되는 PL / SQL 데이터 구조입니다. 주로 정렬 된 데이터 세트를 보유하는 데 사용됩니다.
Q # 6) Oracle의 Varray에서 요소를 삭제할 수 있습니까?
대답: SQL 문을 사용하여 Varray의 요소를 직접 수정하거나 삭제할 수 없습니다. 테이블에서 Varray를 선택하고 PL / SQL에서 수정 한 다음 테이블을 수정하여 새 Varray에 저장해야합니다.
Q # 7) Nested Table과 Varray의 차이점은 무엇입니까?
답변 : 차이점은 다음과 같습니다.
- 이전에 요소의 수를 알 때 Varray를 사용합니다. 이 제한은 중첩 테이블에서 가능하지 않습니다.
- Varray에서는 요소가 순서대로 사용됩니다. 중첩 테이블에는 조밀 및 희소 특성이 모두 있습니다.
- 요소는 항상 Varray로 정렬됩니다. 요소는 중첩 테이블에서 순서가 맞을 수도 있고 아닐 수도 있습니다.
결론
이 튜토리얼에서는 PL / SQL에 대한 지식을 개발하는 데 필수적인 PL / SQL의 몇 가지 기본 개념에 대해 자세히 설명했습니다.
아래에 나열된 다음 주제를 다루었습니다.
- PL SQL 컬렉션 (메서드 및 예외)에 대한 기본 이해.
- Varrays.
- 중첩 테이블
- 인덱스 별 테이블
<< PREV Tutorial | 다음 튜토리얼 >>