Oracle PL/SQL 컬렉션: 테이블별 Varray, 중첩 및 인덱스
수집이란 무엇입니까?
컬렉션은 특정 데이터 유형의 요소의 정렬된 그룹입니다. 단순 데이터 유형 또는 복합 데이터 유형(사용자 정의 또는 레코드 유형과 같은)의 컬렉션이 될 수 있습니다.
컬렉션에서 각 요소는라는 용어로 식별됩니다. “아래첨자.” 컬렉션의 각 항목에는 고유한 아래 첨자가 할당됩니다. 해당 컬렉션의 데이터는 고유한 아래 첨자를 참조하여 조작하거나 가져올 수 있습니다.
컬렉션은 동일한 유형의 대규모 데이터를 처리하거나 조작해야 할 때 가장 유용한 것입니다. 컬렉션은 'BULK' 옵션을 사용하여 전체적으로 채우고 조작할 수 있습니다. Oracle.
컬렉션은 아래와 같이 구조, 첨자, 저장 공간에 따라 분류됩니다.
- 테이블별 인덱스(연관 배열이라고도 함)
- 중첩된 테이블
- 바라이
언제든지 컬렉션의 데이터는 컬렉션 이름, 아래 첨자, 필드/열 이름이라는 세 가지 용어로 참조할 수 있습니다. ( ). ". 아래 섹션에서 위에서 언급한 컬렉션 카테고리에 대해 자세히 알아볼 것입니다.
바라이
Varray는 배열의 크기가 고정된 수집 방법입니다. 배열 크기는 고정된 값보다 초과될 수 없습니다. Varray의 아래 첨자는 숫자 값입니다. 다음은 Varray의 속성입니다.
- 상한 크기는 고정되어 있습니다.
- 아래첨자 '1'부터 순차적으로 채워집니다.
- 이 컬렉션 유형은 항상 조밀합니다. 즉, 배열 요소를 삭제할 수 없습니다. Varray는 전체적으로 삭제될 수도 있고, 끝부분부터 잘라낼 수도 있습니다.
- 본질적으로 항상 밀도가 높기 때문에 유연성이 매우 낮습니다.
- 배열 크기를 알고 있을 때 사용하고 모든 배열 요소에 대해 유사한 활동을 수행하는 것이 더 적절합니다.
- 아래 첨자와 순서는 항상 안정적으로 유지됩니다. 즉 컬렉션의 아래 첨자와 개수는 항상 동일합니다.
- 프로그램에서 사용하기 전에 초기화해야 합니다. 초기화되지 않은 컬렉션에서 EXISTS 작업을 제외한 모든 작업은 오류를 발생시킵니다.
- 이는 데이터베이스 전체 또는 하위 프로그램 내부에서 볼 수 있고 해당 하위 프로그램에서만 사용할 수 있는 데이터베이스 개체로 생성될 수 있습니다.
아래 그림은 Varray(dense)의 메모리 할당을 도식적으로 설명합니다.
첨자 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
가치관 | Xyz | Dfv | SDE | Cxs | VBC | Nhu는 | Qwe |
VARRAY 구문:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- 위의 구문에서 type_name은 주어진 크기 제한에 대해 'DATA_TYPE' 유형의 VARRAY로 선언됩니다. 데이터 유형은 단순 유형 또는 복합 유형일 수 있습니다.
중첩 테이블
중첩 테이블은 배열의 크기가 고정되지 않은 컬렉션입니다. 숫자 아래 첨자 유형이 있습니다. 다음은 중첩 테이블 유형에 대한 자세한 설명입니다.
- 중첩 테이블에는 크기 상한이 없습니다.
- 최대 크기 제한이 고정되어 있지 않기 때문에 컬렉션, 메모리를 사용하기 전에 매번 확장해야 합니다. 'EXTEND' 키워드를 사용하여 컬렉션을 확장할 수 있습니다.
- 아래첨자 '1'부터 순차적으로 채워집니다.
- 이 컬렉션 유형은 둘 다일 수 있습니다. 조밀하고 희박한즉, 컬렉션을 조밀하게 생성할 수도 있고 개별 배열 요소를 무작위로 삭제하여 희소하게 만들 수도 있습니다.
- 배열 요소 삭제와 관련하여 더 많은 유연성을 제공합니다.
- 이는 시스템 생성 데이터베이스 테이블에 저장되며 선택 쿼리에서 값을 가져오는 데 사용될 수 있습니다.
- 아래 첨자와 순서는 안정적이지 않습니다. 즉, 아래 첨자와 배열 요소의 개수가 다를 수 있습니다.
- 프로그램에서 사용하기 전에 초기화해야 합니다. 초기화되지 않은 컬렉션에서 모든 작업(EXISTS 작업 제외)은 오류를 발생시킵니다.
- 이는 데이터베이스 전체 또는 하위 프로그램 내부에서 볼 수 있고 해당 하위 프로그램에서만 사용할 수 있는 데이터베이스 개체로 생성될 수 있습니다.
아래 그림은 Nested Table(dense 및 sparse)의 메모리 할당을 도식적으로 설명합니다. 검은색 요소 공간은 컬렉션의 빈 요소, 즉 희소 요소를 나타냅니다.
첨자 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
값(밀도) | Xyz | Dfv | SDE | Cxs | VBC | Nhu는 | Qwe |
값(희소) | Qwe | ASD | 아프간 | ASD | WER |
중첩 테이블의 구문:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- 위 구문에서 type_name은 'DATA_TYPE' 유형의 중첩 테이블 컬렉션으로 선언됩니다. 데이터 유형은 단순 유형 또는 복합 유형일 수 있습니다.
테이블별 인덱스
인덱스-바이-테이블은 배열 크기가 고정되지 않은 컬렉션입니다. 다른 컬렉션 유형과 달리 인덱스-바이-테이블 컬렉션에서는 사용자가 서브스크립트를 정의할 수 있습니다. 인덱스-바이-테이블의 속성은 다음과 같습니다.
- 아래 첨자는 정수 또는 문자열일 수 있습니다. 컬렉션 생성 시 첨자 유형을 언급해야 합니다.
- 이러한 컬렉션은 순차적으로 저장되지 않습니다.
- 그들은 본질적으로 항상 드물다.
- 배열 크기는 고정되어 있지 않습니다.
- 데이터베이스 열에 저장할 수 없습니다. 이는 해당 특정 세션의 모든 프로그램에서 생성되고 사용됩니다.
- 첨자를 유지하는 측면에서 더 많은 유연성을 제공합니다.
- 아래첨자는 음의 아래첨자 순서일 수도 있습니다.
- 컬렉션을 초기화하고 동일한 하위 프로그램 내에서 사용할 수 있는 비교적 작은 집합 값에 사용하는 것이 더 적합합니다.
- 사용을 시작하기 전에 초기화할 필요가 없습니다.
- 데이터베이스 개체로 생성할 수 없습니다. 이는 하위 프로그램 내부에서만 생성할 수 있으며 해당 하위 프로그램에서만 사용할 수 있습니다.
- 컬렉션의 각 레코드에 대해 아래 첨자를 명시적으로 제공해야 하므로 이 컬렉션 유형에서는 BULK COLLECT를 사용할 수 없습니다.
아래 그림은 Nested Table(sparse)의 메모리 할당을 도식적으로 설명합니다. 검은색 요소 공간은 컬렉션의 빈 요소, 즉 희소 요소를 나타냅니다.
아래첨자(varchar) | 먼저 | 둘째 | THIRD | 네번째 | 다섯 번째 | 여섯 번째 | 제칠 |
값(희소) | Qwe | ASD | 아프간 | ASD | WER |
테이블별 인덱스 구문
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- 위의 구문에서 type_name은 'DATA_TYPE' 유형의 인덱스-테이블 컬렉션으로 선언됩니다. 데이터 유형은 단순 또는 복합 유형일 수 있습니다. subsciprt/index 변수는 최대 크기가 2인 VARCHAR10 유형으로 제공됩니다.
컬렉션의 생성자와 초기화 개념
생성자는 객체 또는 컬렉션과 동일한 이름을 가진 오라클에서 제공하는 내장 함수입니다. 객체 또는 컬렉션이 세션에서 처음으로 참조될 때마다 먼저 실행됩니다. 컬렉션 컨텍스트에서 생성자의 중요한 세부 사항은 다음과 같습니다.
- 컬렉션의 경우 이러한 생성자를 명시적으로 호출하여 초기화해야 합니다.
- Varray 및 Nested 테이블은 모두 프로그램에 참조되기 전에 이러한 생성자를 통해 초기화되어야 합니다.
- 생성자는 컬렉션(Varray 제외)에 대한 메모리 할당을 암시적으로 확장하므로 생성자는 변수를 컬렉션에 할당할 수도 있습니다.
- 생성자를 통해 컬렉션에 값을 할당하면 컬렉션이 희박해지지 않습니다.
수집방법
Oracle 컬렉션을 조작하고 작업하기 위한 많은 기능을 제공합니다. 이러한 기능은 프로그램에서 컬렉션의 다양한 속성을 결정하고 수정하는 데 매우 유용합니다. 다음 표에서는 다양한 기능과 해당 설명을 제공합니다.
방법 | 기술설명 | 통사론 |
---|---|---|
존재함(n) | 이 메서드는 부울 결과를 반환합니다. n이면 'TRUE'를 반환합니다.th 해당 컬렉션에 요소가 존재하면 FALSE를 반환합니다. 초기화되지 않은 컬렉션에서는 EXISTS 함수만 사용할 수 있습니다. | .EXISTS(요소_위치) |
COUNT | 컬렉션에 존재하는 요소의 총 개수를 제공합니다. | .세다 |
제한 | 컬렉션의 최대 크기를 반환합니다. Varray의 경우 정의된 고정 크기를 반환합니다. 중첩 테이블 및 테이블별 인덱스의 경우 NULL을 제공합니다. | .한계 |
먼저 | 컬렉션의 첫 번째 인덱스 변수(아래 첨자)의 값을 반환합니다. | .첫 번째 |
LAST | 컬렉션의 마지막 인덱스 변수(첨자)의 값을 반환합니다. | .마지막 |
이전 (n) | n개의 컬렉션에서 인덱스 변수보다 먼저 반환됩니다.th 요소. 선행 인덱스 값이 없으면 NULL이 반환됩니다. | .이전(n) |
다음(n) | n개의 컬렉션에서 인덱스 변수를 성공으로 반환합니다.th 요소. 성공하지 못한 경우 인덱스 값 NULL이 반환됩니다. | .다음(n) |
넓히다 | 마지막에 컬렉션의 한 요소를 확장합니다. | .연장하다 |
확장(n) | 컬렉션 끝에서 n개의 요소를 확장합니다. | .EXTEND(n) |
확장(n,i) | i의 n개 복사본을 확장합니다.th 컬렉션 끝에 있는 요소 | .EXTEND(n,i) |
정돈 | 컬렉션 끝에서 하나의 요소를 제거합니다. | .손질 |
트림(n) | 컬렉션 끝에서 n개의 요소를 제거합니다. | .트림(n) |
삭제 | 컬렉션에서 모든 요소를 삭제합니다. 컬렉션을 비워줍니다 | .삭제 |
삭제(n) | 컬렉션에서 n번째 요소를 삭제합니다. 만약 nth 요소가 NULL이면 아무 작업도 수행되지 않습니다. | .DELETE(n) |
삭제(m,n) | m 범위의 요소를 삭제합니다.th n으로th 컬렉션에서 | .DELETE(m,n) |
예1: 하위 프로그램 수준의 레코드 유형
이 예에서는 '를 사용하여 컬렉션을 채우는 방법을 살펴보겠습니다.대량 수집'와 수집 데이터를 참조하는 방법을 설명합니다.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); BEGIN INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000); INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000); INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000); COMMIT: SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec FROM emp; dbms_output.put_line (‘Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no); dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name); dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary); dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager); dbms_output.put_line('--------------------------------'); END LOOP; END; /
코드 설명 :
- 코드 라인 2-8: 레코드 유형 'emp_det'은 emp_no, emp_name, 급여 및 데이터 유형 NUMBER, VARCHAR2, NUMBER, NUMBER의 관리자 열로 선언됩니다.
- 코드 라인 9: 레코드 유형 요소 'emp_det'의 컬렉션 'emp_det_tbl' 생성
- 코드 라인 10: 'guru99_emp_rec' 변수를 'emp_det_tbl' 유형으로 선언하고 null 생성자로 초기화합니다.
- 코드 라인 12-15: 샘플 데이터를 'emp' 테이블에 삽입합니다.
- 코드 라인 16: 삽입 트랜잭션을 커밋합니다.
- 코드 라인 17: 'emp' 테이블에서 레코드를 가져오고 "BULK COLLECT" 명령을 사용하여 컬렉션 변수를 대량으로 채웁니다. 이제 'guru99_emp_rec' 변수에는 'emp' 테이블에 있는 모든 레코드가 포함됩니다.
- 코드 라인 19-26: 컬렉션의 모든 레코드를 하나씩 인쇄하는 데 사용하는 'FOR' 루프를 설정합니다. 수집 방법 FIRST 및 LAST는 하한 및 상한으로 사용됩니다. 고리.
산출: 위의 스크린샷에서 볼 수 있듯이 위의 코드를 실행하면 다음과 같은 출력이 나옵니다.
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------