PL/SQL - 包



在本章中,我們將討論 PL/SQL 中的包。包是模式物件,用於對邏輯相關的 PL/SQL 型別、變數和子程式進行分組。

一個包將有兩個必備部分:

  • 包規範
  • 包主體或定義

包規範

規範是包的介面。它只是**宣告**可以從包外部引用的型別、變數、常量、異常、遊標和子程式。換句話說,它包含有關包內容的所有資訊,但不包括子程式的程式碼。

放在規範中的所有物件都稱為**公共**物件。任何不在包規範中但在包主體中編碼的子程式都稱為**私有**物件。

以下程式碼片段顯示了一個包含單個過程的包規範。您可以在一個包中定義許多全域性變數以及多個過程或函式。

CREATE PACKAGE cust_sal AS 
   PROCEDURE find_sal(c_id customers.id%type); 
END cust_sal; 
/

當以上程式碼在 SQL 提示符下執行時,它會產生以下結果:

Package created.

包主體

包主體包含在包規範中宣告的各種方法的程式碼以及其他私有宣告,這些宣告對包外部的程式碼隱藏。

**CREATE PACKAGE BODY**語句用於建立包主體。以下程式碼片段顯示了上面建立的**cust_sal**包的包主體宣告。我假設我們已經在資料庫中建立了 CUSTOMERS 表,如PL/SQL - 變數章節所述。

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

當以上程式碼在 SQL 提示符下執行時,它會產生以下結果:

Package body created.

使用包元素

包元素(變數、過程或函式)使用以下語法訪問:

package_name.element_name;

假設我們已經在資料庫模式中建立了上述包,以下程式使用**cust_sal**包的**find_sal**方法:

DECLARE 
   code customers.id%type := &cc_id; 
BEGIN 
   cust_sal.find_sal(code); 
END; 
/

當以上程式碼在 SQL 提示符下執行時,它會提示輸入客戶 ID,當您輸入 ID 時,它會顯示相應的工資,如下所示:

Enter value for cc_id: 1 
Salary: 3000 

PL/SQL procedure successfully completed. 

示例

以下程式提供了一個更完整的包。我們將使用儲存在我們資料庫中的 CUSTOMERS 表,其中包含以下記錄:

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 | 
+----+----------+-----+-----------+----------+

包規範

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

當以上程式碼在 SQL 提示符下執行時,它會建立上述包並顯示以下結果:

Package created.

建立包主體

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

以上示例使用了**巢狀表**。我們將在下一章討論巢狀表的概念。

當以上程式碼在 SQL 提示符下執行時,它會產生以下結果:

Package body created.

使用包

以下程式使用在包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; 
/  

當以上程式碼在 SQL 提示符下執行時,它會產生以下結果:

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 
廣告

© . All rights reserved.