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 범위이고 아래 첨자는이 범위 밖에 있습니다. |