PL / SQL - Bộ sưu tập

Trong chương này, chúng ta sẽ thảo luận về các Tập hợp trong PL / SQL. Tập hợp là một nhóm có thứ tự các phần tử có cùng kiểu dữ liệu. Mỗi phần tử được xác định bởi một chỉ số con duy nhất thể hiện vị trí của nó trong tập hợp.

PL / SQL cung cấp ba kiểu tập hợp:

  • Lập chỉ mục theo bảng hoặc mảng liên kết
  • Bảng lồng nhau
  • Mảng kích thước thay đổi hoặc Varray

Tài liệu Oracle cung cấp các đặc điểm sau cho từng loại tập hợp:

Loại bộ sưu tập Số phần tử Loại chỉ số Dày đặc hoặc thưa thớt Nơi tạo ra Có thể là thuộc tính loại đối tượng
Mảng liên kết (hoặc bảng chỉ mục) Không giới hạn Chuỗi hoặc số nguyên Hoặc Chỉ trong khối PL / SQL Không
Bảng lồng nhau Không giới hạn Số nguyên Bắt đầu dày đặc, có thể trở nên thưa thớt Trong khối PL / SQL hoặc ở cấp lược đồ Đúng
Kích thước mảng biến đổi (Varray) Bị ràng buộc Số nguyên Luôn dày đặc Trong khối PL / SQL hoặc ở cấp lược đồ Đúng

Chúng ta đã thảo luận về varray trong chương 'PL/SQL arrays'. Trong chương này, chúng ta sẽ thảo luận về các bảng PL / SQL.

Cả hai loại bảng PL / SQL, tức là bảng theo chỉ mục và bảng lồng nhau có cấu trúc giống nhau và các hàng của chúng được truy cập bằng cách sử dụng ký hiệu chỉ số con. Tuy nhiên, hai loại bảng này khác nhau ở một khía cạnh; các bảng lồng nhau có thể được lưu trữ trong một cột cơ sở dữ liệu và các bảng theo chỉ mục thì không.

Chỉ mục theo bảng

An index-by bảng (còn được gọi là associative array) là một tập hợp của key-valuecặp. Mỗi khóa là duy nhất và được sử dụng để định vị giá trị tương ứng. Khóa có thể là một số nguyên hoặc một chuỗi.

Một bảng chỉ mục được tạo bằng cú pháp sau. Ở đây, chúng tôi đang tạoindex-by bảng tên table_name, các khóa trong đó sẽ thuộc loại chỉ số con và các giá trị được liên kết sẽ thuộc loại_phần tử

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

Thí dụ

Ví dụ sau cho thấy cách tạo một bảng để lưu trữ các giá trị số nguyên cùng với tên và sau đó nó sẽ in ra cùng một danh sách các tên.

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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.

Thí dụ

Các phần tử của một bảng chỉ mục cũng có thể là %ROWTYPE của bất kỳ bảng cơ sở dữ liệu nào hoặc %TYPEcủa bất kỳ trường bảng cơ sở dữ liệu nào. Ví dụ sau minh họa khái niệm này. Chúng tôi sẽ sử dụngCUSTOMERS bảng được lưu trữ trong cơ sở dữ liệu của chúng tôi dưới dạng -

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed

Bảng lồng nhau

A nested tablegiống như mảng một chiều với số phần tử tùy ý. Tuy nhiên, bảng lồng nhau khác với một mảng ở các khía cạnh sau:

  • Một mảng có một số phần tử được khai báo, nhưng một bảng lồng nhau thì không. Kích thước của một bảng lồng nhau có thể tăng động.

  • Một mảng luôn dày đặc, tức là nó luôn có các chỉ số con liên tiếp. Một mảng lồng nhau ban đầu dày đặc, nhưng nó có thể trở nên thưa thớt khi các phần tử bị xóa khỏi nó.

Một bảng lồng nhau được tạo bằng cú pháp sau:

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

Khai báo này tương tự như khai báo một index-by bảng, nhưng không có INDEX BY mệnh đề.

Một bảng lồng nhau có thể được lưu trữ trong một cột cơ sở dữ liệu. Nó còn có thể được sử dụng để đơn giản hóa các hoạt động SQL trong đó bạn nối bảng một cột với một bảng lớn hơn. Một mảng kết hợp không thể được lưu trữ trong cơ sở dữ liệu.

Thí dụ

Các ví dụ sau minh họa việc sử dụng bảng lồng nhau:

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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.

Thí dụ

Các yếu tố của một nested table cũng có thể là một %ROWTYPEcủa bất kỳ bảng cơ sở dữ liệu nào hoặc% TYPE của bất kỳ trường bảng cơ sở dữ liệu nào. Ví dụ sau minh họa khái niệm này. Chúng tôi sẽ sử dụng bảng CUSTOMERS được lưu trữ trong cơ sở dữ liệu của chúng tôi dưới dạng:

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; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

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

PL/SQL procedure successfully completed.

Phương thức thu thập

PL / SQL cung cấp các phương thức thu thập tích hợp sẵn để làm cho các tập hợp dễ sử dụng hơn. Bảng sau liệt kê các phương pháp và mục đích của chúng:

S.Không Tên phương pháp & Mục đích
1

EXISTS(n)

Trả về TRUE nếu phần tử thứ n trong một tập hợp tồn tại; nếu không trả về FALSE.

2

COUNT

Trả về số phần tử mà một tập hợp hiện đang chứa.

3

LIMIT

Kiểm tra kích thước tối đa của một bộ sưu tập.

4

FIRST

Trả về các số chỉ mục đầu tiên (nhỏ nhất) trong một tập hợp sử dụng các chỉ số số nguyên.

5

LAST

Trả về các số chỉ mục cuối cùng (lớn nhất) trong một tập hợp sử dụng các chỉ số số nguyên.

6

PRIOR(n)

Trả về số chỉ mục đứng trước chỉ mục n trong một tập hợp.

7

NEXT(n)

Trả về số chỉ mục kế tiếp chỉ mục n.

số 8

EXTEND

Thêm một phần tử rỗng vào một tập hợp.

9

EXTEND(n)

Thêm n phần tử rỗng vào một tập hợp.

10

EXTEND(n,i)

Xuất hiện ncác bản sao của phần tử thứ i vào một tập hợp.

11

TRIM

Xóa một phần tử khỏi phần cuối của tập hợp.

12

TRIM(n)

Loại bỏ n các yếu tố từ cuối tập hợp.

13

DELETE

Xóa tất cả các phần tử khỏi bộ sưu tập, đặt COUNT thành 0.

14

DELETE(n)

Loại bỏ nthphần tử từ một mảng kết hợp với một khóa số hoặc một bảng lồng nhau. Nếu mảng kết hợp có khóa chuỗi, phần tử tương ứng với giá trị khóa sẽ bị xóa. Nếun là null, DELETE(n) Không lam gi cả.

15

DELETE(m,n)

Loại bỏ tất cả các phần tử trong phạm vi m..ntừ một mảng kết hợp hoặc bảng lồng nhau. Nếum lớn hơn n hoặc nếu m hoặc là n là null, DELETE(m,n) Không lam gi cả.

Ngoại lệ Bộ sưu tập

Bảng sau cung cấp các ngoại lệ của bộ sưu tập và khi nào chúng được nâng lên:

Ngoại lệ Bộ sưu tập Lớn lên trong các tình huống
COLLECTION_IS_NULL Bạn cố gắng vận hành trên một tập hợp rỗng nguyên tử.
KHÔNG TÌM THẤY DỮ LIỆU NÀO Chỉ số con chỉ định một phần tử đã bị xóa hoặc một phần tử không tồn tại của một mảng kết hợp.
SUBSCRIPT_BEYOND_COUNT Chỉ số con vượt quá số phần tử trong một tập hợp.
SUBSCRIPT_OUTSIDE_LIMIT Chỉ số con nằm ngoài phạm vi cho phép.
VALUE_ERROR Chỉ số con là null hoặc không thể chuyển đổi thành loại khóa. Ngoại lệ này có thể xảy ra nếu khóa được xác định làPLS_INTEGER và chỉ số con nằm ngoài phạm vi này.