Thứ Tư, 26 tháng 10, 2022

PL/SQL - Collections

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ằng 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 bộ sưu tậ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 bị ràng buộc

Chuỗi hoặc số nguyên

Một trong hai

Chỉ trong khối PL/SQL

Không

Bảng lồng nhau

Không bị ràng buộc

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 'Mảng PL/SQL' . 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.

Lập index (chỉ mục) theo bảng

Bảng theo chỉ mục (còn được gọi là mảng kết hợp ) là một tập hợp các cặp khóa-giá trị . 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ạo một bảng chỉ mục có tên table_name , các khóa trong số đó sẽ thuộc kiểu subscript_type và các giá trị liên quan sẽ thuộc element_type

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

 

table_name type_name;


Thí dụ

Ví dụ sau đây 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 bảng theo 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 % 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. 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.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

Một bảng lồng nhau giống như một mảng một chiều với một số phần tử tùy ý. Tuy nhiên, một 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 bảng chỉ mục , nhưng không có mệnh đề INDEX BY .

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 phần tử của bảng lồng nhau cũng có thể là % ROWTYPE củ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. 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 được tích hợp sẵn giúp sử dụng tập hợp dễ 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

EXIST (n)

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

2

ĐẾM

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

Last

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

CUỐI CÙNG

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

TIẾP THEO (n)

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

số 8

GIA HẠN

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)

Thêm n 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 phần tử khỏi phần cuối của một 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ỏ phần tử thứ n khỏi 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ếu n rỗng, DELETE (n) không làm gì cả.

15

DELETE (m, n)

Loại bỏ tất cả các phần tử trong phạm vi m..n khỏi một mảng kết hợp hoặc bảng lồng nhau. Nếu m lớn hơn n hoặc nếu m hoặc n rỗng, DELETE (m, n) không làm gì 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 về mặt 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

Một 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à phạm vi PLS_INTEGER và chỉ số con nằm ngoài phạm vi này.


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
PL/SQL, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master