PL / SQL - Gói

Trong chương này, chúng ta sẽ thảo luận về các Gói trong PL / SQL. 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 PL / SQL 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

Quy cách gói

Đặc điểm kỹ thuật là giao diện của gói. Chỉ làDECLAREScá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 publiccác đối tượng. 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 phần thân gói được gọi làprivate vật.

Đoạn mã sau đây cho thấy một đặc tả gói có một thủ tục. 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.

Gói cơ thể

Phần thân gói 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ác CREATE PACKAGE BODYCâu lệnh được sử dụng để tạo phần thân gói. Đoạn mã sau hiển thị khai báo nội dung gói chocust_salgói đã 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 PL / SQL - 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 bằng cú pháp sau:

package_name.element_name;

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

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.No.ame%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 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.No.ame%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 nested table. 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