PL / SQL-컬렉션

이 장에서는 PL / SQL의 컬렉션에 대해 설명합니다. 컬렉션은 동일한 데이터 유형을 가진 정렬 된 요소 그룹입니다. 각 요소는 컬렉션에서의 위치를 ​​나타내는 고유 한 아래 첨자로 식별됩니다.

PL / SQL은 세 가지 컬렉션 유형을 제공합니다.

  • 인덱스 별 테이블 또는 연관 배열
  • 중첩 테이블
  • 가변 크기 배열 또는 Varray

오라클 문서는 각 컬렉션 유형에 대해 다음과 같은 특성을 제공합니다.

수집 유형 요소 수 아래 첨자 유형 고밀도 또는 희소 만든 곳 객체 유형 속성 일 수 있음
연관 배열 (또는 인덱스 별 테이블) 무제한 문자열 또는 정수 어느 한 쪽 PL / SQL 블록에서만 아니
중첩 테이블 무제한 정수 조밀하게 시작하여 희박해질 수 있음 PL / SQL 블록 또는 스키마 수준
가변 크기 배열 (Varray) 경계 정수 항상 조밀함 PL / SQL 블록 또는 스키마 수준

우리는 이미 장에서 varray에 대해 논의했습니다. 'PL/SQL arrays'. 이 장에서는 PL / SQL 테이블에 대해 설명합니다.

두 유형의 PL / SQL 테이블, 즉 index-by 테이블과 중첩 테이블은 동일한 구조를 가지며 해당 행은 첨자 표기법을 사용하여 액세스됩니다. 그러나이 두 가지 유형의 테이블은 한 가지 측면에서 다릅니다. 중첩 된 테이블은 데이터베이스 열에 저장할 수 있지만 인덱스 별 테이블은 저장할 수 없습니다.

인덱스 별 테이블

index-by 테이블 (또는 associative array)는 key-value한 쌍. 각 키는 고유하며 해당 값을 찾는 데 사용됩니다. 키는 정수 또는 문자열 일 수 있습니다.

index-by 테이블은 다음 구문을 사용하여 생성됩니다. 여기에서 우리는index-by 테이블 이름 table_name, 키는 subscript_type이되고 관련 값은 element_type이됩니다.

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; 
 
table_name type_name;

다음 예제는 이름과 함께 정수 값을 저장하는 테이블을 생성하고 나중에 동일한 이름 목록을 인쇄하는 방법을 보여줍니다.

DECLARE 
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); 
   salary_list salary; 
   name   VARCHAR2(20); 
BEGIN 
   -- adding elements to the table 
   salary_list('Rajnish') := 62000; 
   salary_list('Minakshi') := 75000; 
   salary_list('Martin') := 100000; 
   salary_list('James') := 78000;  
   
   -- printing the table 
   name := salary_list.FIRST; 
   WHILE name IS NOT null LOOP 
      dbms_output.put_line 
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); 
      name := salary_list.NEXT(name); 
   END LOOP; 
END; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Salary of James is 78000 
Salary of Martin is 100000 
Salary of Minakshi is 75000 
Salary of Rajnish is 62000  

PL/SQL procedure successfully completed.

인덱스 기준 테이블의 요소는 %ROWTYPE 모든 데이터베이스 테이블 또는 %TYPE모든 데이터베이스 테이블 필드의. 다음 예는 개념을 보여줍니다. 우리는CUSTOMERS 우리 데이터베이스에 저장된 테이블-

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is 
      select name from customers; 

   TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer; 
   name_list c_list; 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter)); 
   END LOOP; 
END; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed

중첩 테이블

nested table임의의 수의 요소가있는 1 차원 배열과 같습니다. 그러나 중첩 테이블은 다음 측면에서 배열과 다릅니다.

  • 배열에는 선언 된 수의 요소가 있지만 중첩 테이블에는 없습니다. 중첩 테이블의 크기는 동적으로 증가 할 수 있습니다.

  • 배열은 항상 조밀합니다. 즉, 항상 연속적인 첨자가 있습니다. 중첩 배열은 처음에는 조밀하지만 요소가 삭제되면 희소해질 수 있습니다.

중첩 테이블은 다음 구문을 사용하여 생성됩니다-

TYPE type_name IS TABLE OF element_type [NOT NULL]; 
 
table_name type_name;

이 선언은 다음 선언과 유사합니다. index-by 테이블이 있지만 INDEX BY 절.

중첩 테이블은 데이터베이스 열에 저장할 수 있습니다. 또한 단일 열 테이블을 더 큰 테이블과 조인하는 SQL 작업을 단순화하는 데 사용할 수 있습니다. 연관 배열은 데이터베이스에 저장할 수 없습니다.

다음 예제는 중첩 테이블의 사용을 설명합니다-

DECLARE 
   TYPE names_table IS TABLE OF VARCHAR2(10); 
   TYPE grades IS TABLE OF INTEGER;  
   names names_table; 
   marks grades; 
   total integer; 
BEGIN 
   names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i IN 1 .. total LOOP 
      dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i)); 
   end loop; 
END; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Total 5 Students 
Student:Kavita, Marks:98 
Student:Pritam, Marks:97 
Student:Ayan, Marks:78 
Student:Rishav, Marks:87 
Student:Aziz, Marks:92  

PL/SQL procedure successfully completed.

의 요소 nested table 또한 %ROWTYPE데이터베이스 테이블 또는 데이터베이스 테이블 필드의 % TYPE. 다음 예는 개념을 보여줍니다. 데이터베이스에 저장된 CUSTOMERS 테이블을 다음과 같이 사용합니다.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is  
      SELECT  name FROM customers;  
   TYPE c_list IS TABLE of customerS.No.ame%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

수집 방법

PL / SQL은 컬렉션을보다 쉽게 ​​사용할 수 있도록 기본 제공 컬렉션 메서드를 제공합니다. 다음 표는 방법과 목적을 나열합니다.

S. 아니 방법 이름 및 목적
1

EXISTS(n)

컬렉션의 n 번째 요소가 있으면 TRUE를 반환합니다. 그렇지 않으면 FALSE를 반환합니다.

2

COUNT

컬렉션에 현재 포함 된 요소 수를 반환합니다.

LIMIT

컬렉션의 최대 크기를 확인합니다.

4

FIRST

정수 첨자를 사용하는 컬렉션에서 첫 번째 (가장 작은) 인덱스 번호를 반환합니다.

5

LAST

정수 첨자를 사용하는 컬렉션에서 마지막 (가장 큰) 인덱스 번호를 반환합니다.

6

PRIOR(n)

컬렉션에서 인덱스 n 앞에 오는 인덱스 번호를 반환합니다.

7

NEXT(n)

인덱스 n에 이은 인덱스 번호를 반환합니다.

8

EXTEND

컬렉션에 하나의 null 요소를 추가합니다.

9

EXTEND(n)

n 개의 null 요소를 컬렉션에 추가합니다.

10

EXTEND(n,i)

추가 ni 번째 요소를 컬렉션에 복사합니다 .

11

TRIM

컬렉션의 끝에서 한 요소를 제거합니다.

12

TRIM(n)

제거 n 컬렉션의 끝에서 요소.

13

DELETE

컬렉션에서 모든 요소를 ​​제거하고 COUNT를 0으로 설정합니다.

14

DELETE(n)

제거합니다 nth숫자 키 또는 중첩 테이블이있는 연관 배열의 요소. 연관 배열에 문자열 키가있는 경우 키 값에 해당하는 요소가 삭제됩니다. 만약n null, DELETE(n) 아무것도하지 않습니다.

15

DELETE(m,n)

범위의 모든 요소를 ​​제거합니다. m..n연관 배열 또는 중첩 테이블에서. 만약m 보다 크다 n 또는 m 또는 n null, DELETE(m,n) 아무것도하지 않습니다.

수집 예외

다음 표는 컬렉션 예외와 발생시기를 제공합니다.

수집 예외 상황에서 발생
COLLECTION_IS_NULL 원자 적으로 null 컬렉션에서 작업하려고합니다.
데이터가 없습니다 아래 첨자는 삭제 된 요소 또는 연관 배열의 존재하지 않는 요소를 지정합니다.
SUBSCRIPT_BEYOND_COUNT 아래 첨자가 컬렉션의 요소 수를 초과합니다.
SUBSCRIPT_OUTSIDE_LIMIT 아래 첨자가 허용 범위를 벗어났습니다.
VALUE_ERROR 아래 첨자가 null이거나 키 유형으로 변환 할 수 없습니다. 이 예외는 키가PLS_INTEGER 범위이고 아래 첨자는이 범위 밖에 있습니다.