
- 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.
Learn SQL in-depth with real-world projects through our SQL certification course. Enroll and become a certified expert to boost your career.
使用包元素
包元素(变量、过程或函数)使用以下语法访问:
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