- PL/SQL 教程
- PL/SQL - 首頁
- PL/SQL - 概述
- PL/SQL - 環境
- PL/SQL - 基本語法
- PL/SQL - 資料型別
- PL/SQL - 變數
- PL/SQL - 常量和字面量
- PL/SQL - 運算子
- PL/SQL - 條件
- PL/SQL - 迴圈
- PL/SQL - 字串
- PL/SQL - 陣列
- PL/SQL - 過程
- PL/SQL - 函式
- PL/SQL - 遊標
- PL/SQL - 記錄
- PL/SQL - 異常
- PL/SQL - 觸發器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事務
- PL/SQL - 日期和時間
- PL/SQL - DBMS 輸出
- PL/SQL - 面向物件
- PL/SQL 有用資源
- PL/SQL - 問題和解答
- PL/SQL - 快速指南
- PL/SQL - 有用資源
- PL/SQL - 討論
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