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

PL/SQL - Packages (gói)

Trong chương này, chúng ta sẽ thảo luận về các package (Gói) . Các gói là các đối tượng lược đồ nhóm các kiểu, biến và chương trình con  có liên quan về mặt logic.

Một gói sẽ có hai phần bắt buộc -

  • Đặc điểm kỹ thuật gói

  • Nội dung hoặc định nghĩa gói

Đặc điểm kỹ thuật gói

Đặc điểm kỹ thuật là giao diện của gói. Nó chỉ KHAI BÁO các kiểu, biến, hằng số, ngoại lệ, con trỏ và chương trình con có thể được tham chiếu từ bên ngoài gói. Nói cách khác, nó chứa tất cả thông tin về nội dung của gói, nhưng loại trừ mã cho các chương trình con.

Tất cả các đối tượng được đặt trong đặc tả được gọi là đối tượng chung . Bất kỳ chương trình con nào không có trong đặc tả gói nhưng được mã hóa trong thân gói được gọi là đối tượng riêng .

Đoạn mã sau đây cho thấy một đặc tả gói có một thủ tục duy nhất. Bạn có thể có nhiều biến toàn cục được xác định và nhiều thủ tục hoặc hàm bên trong một gói.

CREATE PACKAGE cust_sal AS 

   PROCEDURE find_sal(c_id customers.id%type); 

END cust_sal; 

/

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:

Package created.


PACKAGE BODY

Phần thân gói (package body) có các mã cho các phương thức khác nhau được khai báo trong đặc tả gói và các khai báo riêng tư khác, được ẩn khỏi mã bên ngoài gói.

Câu lệnh CREATE PACKAGE BODY được sử dụng để tạo phần thân của gói. Đoạn mã sau hiển thị khai báo nội dung gói cho gói cust_sal được tạo ở trên. Tôi giả định rằng chúng tôi đã tạo bảng CUSTOMERS trong cơ sở dữ liệu của chúng tôi như đã đề cập trong chương  - Biến .

CREATE OR REPLACE PACKAGE BODY cust_sal AS  

   

   PROCEDURE find_sal(c_id customers.id%TYPE) IS 

   c_sal customers.salary%TYPE; 

   BEGIN 

      SELECT salary INTO c_sal 

      FROM customers 

      WHERE id = c_id; 

      dbms_output.put_line('Salary: '|| c_sal); 

   END find_sal; 

END cust_sal; 

/

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:

Package body created.


Sử dụng các phần tử gói

Các phần tử gói (biến, thủ tục hoặc hàm) được truy cập theo cú pháp sau:

package_name.element_name;


Hãy xem xét, chúng ta đã tạo gói ở trên trong lược đồ cơ sở dữ liệu của mình, chương trình sau sử dụng phương thức find_sal của gói cust_sal -

DECLARE 

   code customers.id%type := &cc_id; 

BEGIN 

   cust_sal.find_sal(code); 

END; 

/

Khi mã trên được thực thi tại dấu nhắc SQL, nó sẽ nhắc nhập ID khách hàng và khi bạn nhập ID, nó sẽ hiển thị mức lương tương ứng như sau:

Enter value for cc_id: 1 

Salary: 3000 


PL/SQL procedure successfully completed. 


Thí dụ

Chương trình sau cung cấp một gói hoàn chỉnh hơn. 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 với các bản ghi sau:

Select * from customers;  


+----+----------+-----+-----------+----------+ 

| ID | NAME     | AGE | ADDRESS   | SALARY   | 

+----+----------+-----+-----------+----------+ 

|  1 | Ramesh   |  32 | Ahmedabad |  3000.00 | 

|  2 | Khilan   |  25 | Delhi     |  3000.00 | 

|  3 | kaushik  |  23 | Kota      |  3000.00 | 

|  4 | Chaitali |  25 | Mumbai    |  7500.00 | 

|  5 | Hardik   |  27 | Bhopal    |  9500.00 | 

|  6 | Komal    |  22 | MP        |  5500.00 | 

+----+----------+-----+-----------+----------+


Đặc điểm kỹ thuật gói

CREATE OR REPLACE PACKAGE c_package AS 

   -- Adds a customer 

   PROCEDURE addCustomer(c_id   customers.id%type, 

   c_name customers.Name%type, 

   c_age  customers.age%type, 

   c_addr customers.address%type,  

   c_sal  customers.salary%type); 

   

   -- Removes a customer 

   PROCEDURE delCustomer(c_id  customers.id%TYPE); 

   --Lists all customers 

   PROCEDURE listCustomer; 

  

END c_package; 

/

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

Package created.


Tạo phần thân gói

CREATE OR REPLACE PACKAGE BODY c_package AS 

   PROCEDURE addCustomer(c_id  customers.id%type, 

      c_name customers.Name%type, 

      c_age  customers.age%type, 

      c_addr  customers.address%type,  

      c_sal   customers.salary%type) 

   IS 

   BEGIN 

      INSERT INTO customers (id,name,age,address,salary) 

         VALUES(c_id, c_name, c_age, c_addr, c_sal); 

   END addCustomer; 

   

   PROCEDURE delCustomer(c_id   customers.id%type) IS 

   BEGIN 

      DELETE FROM customers 

      WHERE id = c_id; 

   END delCustomer;  

   

   PROCEDURE listCustomer IS 

   CURSOR c_customers is 

      SELECT  name FROM customers; 

   TYPE c_list is TABLE OF customers.Name%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 listCustomer;

   

END c_package; 

/

Ví dụ trên sử dụng bảng lồng nhau . Chúng ta sẽ thảo luận về khái niệm bảng lồng nhau trong chương tiếp theo.

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:

Package body created.


Sử dụng gói

Chương trình sau sử dụng các phương thức được khai báo và định nghĩa trong gói c_package .

DECLARE 

   code customers.id%type:= 8; 

BEGIN 

   c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500); 

   c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500); 

   c_package.listcustomer; 

   c_package.delcustomer(code); 

   c_package.listcustomer; 

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 

Customer(7): Rajnish 

Customer(8): Subham 

Customer(1): Ramesh  

Customer(2): Khilan  

Customer(3): kaushik     

Customer(4): Chaitali  

Customer(5): Hardik  

Customer(6): Komal

Customer(7): Rajnish 


PL/SQL procedure successfully completed


=============================
* 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