Bộ sưu tập là gì?
Bộ sưu tập là một nhóm có thứ tự các phần tử của các kiểu dữ liệu cụ thể. Nó có thể là một tập hợp kiểu dữ liệu đơn giản hoặc kiểu dữ liệu phức tạp (như kiểu bản ghi hoặc kiểu do người dùng xác định).
Trong tập hợp, mỗi phần tử được xác định bằng một thuật ngữ gọi là "chỉ số con". Mỗi mục trong bộ sưu tập được chỉ định với một chỉ số phụ duy nhất. Dữ liệu trong bộ sưu tập đó có thể được thao tác hoặc tìm nạp bằng cách tham chiếu đến chỉ số con duy nhất đó.
Bộ sưu tập là những thứ hữu ích nhất khi một dữ liệu lớn cùng loại cần được xử lý hoặc thao tác. Các bộ sưu tập có thể được điền và thao tác toàn bộ bằng cách sử dụng tùy chọn 'BULK' trong Oracle.
Trong hướng dẫn này, bạn sẽ học-
- Bộ sưu tập là gì?
- Varrays
- Bảng lồng nhau
- Lập chỉ mục theo bảng
- Khái niệm về hàm tạo và khởi tạo trong bộ sưu tập
- Phương thức thu thập
Các bộ sưu tập được phân loại dựa trên cấu trúc, chỉ số phụ và lưu trữ như hình dưới đây.
- Chỉ mục theo bảng (còn được gọi là Mảng liên kết)
- Bảng lồng nhau
- Varrays
Tại bất kỳ thời điểm nào, dữ liệu trong bộ sưu tập có thể được gọi bằng ba thuật ngữ Tên bộ sưu tập, Chỉ số con, Tên trường / Cột là "
Varrays
Varray là một phương thức tập hợp trong đó kích thước của mảng là cố định. Kích thước mảng không được vượt quá giá trị cố định của nó. Chỉ số con của Varray có giá trị số. Sau đây là các thuộc tính của Varrays.
- Kích thước giới hạn trên là cố định
- Được điền tuần tự bắt đầu bằng chỉ số phụ '1'
- Kiểu tập hợp này luôn dày đặc, tức là chúng ta không thể xóa bất kỳ phần tử mảng nào. Varray có thể bị xóa toàn bộ hoặc có thể bị cắt bỏ phần cuối.
- Vì nó luôn dày đặc trong tự nhiên, nó có rất ít tính linh hoạt.
- Sẽ thích hợp hơn khi sử dụng khi kích thước mảng đã biết và thực hiện các hoạt động tương tự trên tất cả các phần tử của mảng.
- Chỉ số con và trình tự luôn duy trì ổn định, tức là chỉ số con và số lượng của tập hợp luôn giống nhau.
- Chúng cần được khởi tạo trước khi sử dụng chúng trong các chương trình. Bất kỳ hoạt động nào (ngoại trừ hoạt động EXISTS) trên một bộ sưu tập chưa được khởi tạo sẽ gây ra lỗi.
- Nó có thể được tạo ra dưới dạng một đối tượng cơ sở dữ liệu, đối tượng này có thể nhìn thấy trong toàn bộ cơ sở dữ liệu hoặc bên trong chương trình con, đối tượng này chỉ có thể được sử dụng trong chương trình con đó.
Hình dưới đây sẽ giải thích việc cấp phát bộ nhớ của Varray (dày đặc) theo sơ đồ.
Chỉ số dưới | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Giá trị | XYZ | Dfv | Sde | Cxs | Vbc | Nhu | Qwe |
Cú pháp cho VARRAY:
TYPEIS VARRAY ( ) OF ;
- Trong cú pháp trên, type_name được khai báo là VARRAY của loại 'DATA_TYPE' cho giới hạn kích thước đã cho. Kiểu dữ liệu có thể là kiểu đơn giản hoặc phức tạp.
Bảng lồng nhau
Bảng lồng nhau là một tập hợp trong đó kích thước của mảng không cố định. Nó có kiểu chỉ số dưới dạng số. Dưới đây là các mô tả khác về loại bảng lồng nhau.
- Bảng lồng nhau không có giới hạn kích thước trên.
- Vì giới hạn kích thước trên không cố định, bộ sưu tập, bộ nhớ cần được mở rộng mỗi lần trước khi chúng tôi sử dụng. Chúng tôi có thể mở rộng bộ sưu tập bằng cách sử dụng từ khóa 'EXTEND'.
- Được điền tuần tự bắt đầu bằng chỉ số con '1'.
- Loại tập hợp này có thể vừa dày đặc vừa thưa thớt , tức là chúng ta có thể tạo tập hợp dưới dạng dày đặc và chúng ta cũng có thể xóa phần tử mảng riêng lẻ một cách ngẫu nhiên, làm cho nó trở nên thưa thớt.
- Nó mang lại sự linh hoạt hơn liên quan đến việc xóa phần tử mảng.
- Nó được lưu trữ trong bảng cơ sở dữ liệu do hệ thống tạo ra và có thể được sử dụng trong truy vấn chọn để tìm nạp các giá trị.
- Chỉ số con và trình tự không ổn định, tức là chỉ số con và số lượng của phần tử mảng có thể khác nhau.
- Chúng cần được khởi tạo trước khi sử dụng chúng trong các chương trình. Bất kỳ hoạt động nào (ngoại trừ hoạt động EXISTS) trên bộ sưu tập chưa được khởi tạo sẽ gây ra lỗi.
- Nó có thể được tạo ra dưới dạng một đối tượng cơ sở dữ liệu, đối tượng này có thể nhìn thấy trong toàn bộ cơ sở dữ liệu hoặc bên trong chương trình con, đối tượng này chỉ có thể được sử dụng trong chương trình con đó.
Hình dưới đây sẽ giải thích việc phân bổ bộ nhớ của Bảng lồng nhau (dày đặc và thưa thớt) theo sơ đồ. Không gian phần tử có màu đen biểu thị phần tử trống trong một tập hợp tức là thưa thớt.
Chỉ số dưới | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Giá trị (dày đặc) | XYZ | Dfv | Sde | Cxs | Vbc | Nhu | Qwe |
Giá trị (thưa thớt) | Qwe | Asd | Afghanistan | Asd | Wer |
Cú pháp cho Bảng lồng nhau:
TYPEIS TABLE OF ;
- Trong cú pháp trên, type_name được khai báo là tập hợp bảng lồng nhau của kiểu 'DATA_TYPE'. Kiểu dữ liệu có thể là kiểu đơn giản hoặc phức tạp.
Lập chỉ mục theo bảng
Chỉ mục theo bảng là một tập hợp trong đó kích thước mảng không cố định. Không giống như các loại tập hợp khác, trong tập hợp chỉ mục theo bảng, chỉ số con có thể được xác định bởi người dùng. Sau đây là các thuộc tính của index-by-table.
- Chỉ số con có thể là số nguyên hoặc chuỗi. Tại thời điểm tạo bộ sưu tập, loại chỉ số con nên được đề cập.
- Các bộ sưu tập này không được lưu trữ tuần tự.
- Chúng luôn thưa thớt trong tự nhiên.
- Kích thước mảng không cố định.
- Chúng không thể được lưu trữ trong cột cơ sở dữ liệu. Chúng sẽ được tạo và sử dụng trong bất kỳ chương trình nào trong phiên cụ thể đó.
- Chúng mang lại sự linh hoạt hơn trong việc duy trì chỉ số phụ.
- Các chỉ số phụ cũng có thể là chuỗi chỉ số phụ âm.
- Chúng thích hợp hơn để sử dụng cho các giá trị tập hợp tương đối nhỏ hơn trong đó tập hợp có thể được khởi tạo và sử dụng trong cùng các chương trình con.
- Chúng không cần phải được khởi tạo trước khi bắt đầu sử dụng chúng.
- Nó không thể được tạo như một đối tượng cơ sở dữ liệu. Nó chỉ có thể được tạo bên trong chương trình con, chỉ có thể được sử dụng trong chương trình con đó.
- BULK COLLECT không thể được sử dụng trong loại tập hợp này vì chỉ số con phải được cung cấp rõ ràng cho mỗi bản ghi trong tập hợp.
Hình dưới đây sẽ giải thích việc cấp phát bộ nhớ của Bảng lồng nhau (thưa thớt) theo sơ đồ. Không gian phần tử có màu đen biểu thị phần tử trống trong một tập hợp tức là thưa thớt.
Chỉ số phụ (varchar) | ĐẦU TIÊN | THỨ HAI | NGÀY THỨ BA | THỨ 4 | THỨ NĂM | SÁU | BẢY |
Giá trị (thưa thớt) | Qwe | Asd | Afghanistan | Asd | Wer |
Cú pháp cho Index-by-Table
TYPEIS TABLE OF INDEX BY VARCHAR2 (10);
- Trong cú pháp trên, type_name được khai báo dưới dạng tập hợp chỉ mục theo bảng của kiểu 'DATA_TYPE'. Kiểu dữ liệu có thể là kiểu đơn giản hoặc phức tạp. Biến chỉ số / nhóm con được cung cấp dưới dạng kiểu VARCHAR2 với kích thước tối đa là 10.
Khái niệm về hàm tạo và khởi tạo trong bộ sưu tập
Hàm tạo là hàm tích hợp được cung cấp bởi oracle có cùng tên với đối tượng hoặc các bộ sưu tập. Chúng được thực thi đầu tiên bất cứ khi nào đối tượng hoặc bộ sưu tập được giới thiệu lần đầu tiên trong một phiên. Dưới đây là các chi tiết quan trọng của hàm tạo trong ngữ cảnh bộ sưu tập:
- Đối với các bộ sưu tập, các hàm tạo này nên được gọi một cách rõ ràng để khởi tạo nó.
- Cả bảng Varray và bảng lồng nhau cần phải được khởi tạo thông qua các hàm tạo này trước khi được đưa vào chương trình.
- Hàm tạo mở rộng ngầm định việc cấp phát bộ nhớ cho một tập hợp (ngoại trừ Varray), do đó, phương thức khởi tạo cũng có thể gán các biến cho các tập hợp.
- Việc gán giá trị cho tập hợp thông qua các hàm tạo sẽ không bao giờ làm cho tập hợp trở nên thưa thớt.
Phương thức thu thập
Oracle cung cấp nhiều chức năng để thao tác và làm việc với các bộ sưu tập. Các hàm này rất hữu ích trong chương trình để xác định và sửa đổi các thuộc tính khác nhau của các tập hợp. Bảng sau sẽ cung cấp các chức năng khác nhau và mô tả của chúng.
phương pháp | Sự miêu tả | TỔNG HỢP |
TỒN TẠI (n) | Phương thức này sẽ trả về kết quả Boolean. Nó sẽ trả về 'TRUE' nếu phần tử thứ n tồn tại trong tập hợp đó, nếu không nó sẽ trả về FALSE. Chỉ các hàm EXISTS mới có thể được sử dụng trong bộ sưu tập chưa được khởi tạo | |
ĐẾM | Cung cấp tổng số phần tử có trong một tập hợp | |
GIỚI HẠN | Nó trả về kích thước tối đa của bộ sưu tập. Đối với Varray, nó sẽ trả về kích thước cố định đã được xác định. Đối với bảng lồng nhau và chỉ mục theo bảng, nó cho NULL | |
ĐẦU TIÊN | Trả về giá trị của biến chỉ số đầu tiên (chỉ số con) của các tập hợp | |
CUỐI CÙNG | Trả về giá trị của biến chỉ số cuối cùng (chỉ số con) của các tập hợp | |
PRIOR (n) | Trả về biến chỉ số đứng trước trong tập hợp phần tử thứ n . Nếu không có giá trị chỉ mục trước giá trị NULL được trả về | |
TIẾP THEO (n) | Trả về biến chỉ số thành công trong tập hợp phần tử thứ n . Nếu không có thành công giá trị chỉ mục NULL được trả về | |
MỞ RỘNG | Mở rộng một phần tử trong một tập hợp ở cuối | |
EXTEND (n) | Mở rộng n phần tử ở cuối tập hợp | |
EXTEND (n, i) | Mở rộng n bản sao của phần tử thứ i ở cuối tập hợp | |
TRIM | Xóa một phần tử khỏi phần cuối của bộ sưu tập | |
TRIM (n) | Xóa n phần tử khỏi phần cuối của bộ sưu tập | |
XÓA BỎ | Xóa tất cả các phần tử khỏi bộ sưu tập. Làm cho bộ sưu tập trống rỗng | |
XÓA (n) | Xóa phần tử thứ n khỏi bộ sưu tập. Nếu phần tử thứ n là NULL, thì điều này sẽ không làm gì cả | |
XÓA (m, n) | Xóa phần tử trong khoảng từ thứ m đến thứ n trong tập hợp |
Ví dụ 1: Loại bản ghi ở cấp chương trình con
Trong ví dụ này, chúng ta sẽ xem cách điền vào bộ sưu tập bằng cách sử dụng 'BULK COLLECT' và cách tham khảo dữ liệu bộ sưu tập.
DECLARETYPE 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();BEGININSERT 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_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_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;/
Giải thích mã:
- Dòng mã 2-8 : Loại bản ghi 'emp_det' được khai báo với các cột emp_no, emp_name, lương và người quản lý kiểu dữ liệu NUMBER, VARCHAR2, NUMBER, NUMBER.
- Dòng mã 9: Tạo tập hợp 'emp_det_tbl' của phần tử loại bản ghi 'emp_det'
- Dòng mã 10: Khai báo biến 'guru99_emp_rec' là kiểu 'emp_det_tbl' và được khởi tạo bằng hàm tạo null.
- Dòng mã 12-15: Chèn dữ liệu mẫu vào bảng 'emp'.
- Dòng mã 16: Đang thực hiện giao dịch chèn.
- Dòng mã 17: Tìm nạp các bản ghi từ bảng 'emp' và điền hàng loạt biến bộ sưu tập bằng lệnh "BULK COLLECT". Bây giờ biến 'guru99_emp_rec' chứa tất cả bản ghi có trong bảng 'emp'.
- Dòng mã 19-26: Thiết lập vòng lặp 'FOR' sử dụng để in từng bản ghi trong bộ sưu tập từng cái một. Phương thức thu thập FIRST và LAST được sử dụng như giới hạn thấp hơn và cao hơn của vòng lặp.
Đầu ra : Như bạn có thể thấy trong ảnh chụp màn hình ở trên khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau
Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------