PL/SQL - 包(Packages)

PL/SQL - 包(Packages) 首页 / PL/SQL入门教程 / PL/SQL - 包(Packages)

在本章中,无涯教程将讨论PL/SQL中的软件包,包是架构对象,将逻辑上相关的PL/SQL类型,变量和子程序分组。

规范中放置的所有对象都称为 public 对象,任何不在包规范中但在包主体中编码的子程序都称为 private 对象。

以下代码片段显示了具有单个过程的软件包规范,一个包中可以定义许多全局变量,并可以有多个过程或函数。

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

当以上代码在SQL提示符下执行时,将产生以下输出-

Package created.

包主体(Body)

包主体具有用于程序包规范中声明的各种方法的代码以及其他私有声明,这些代码对于程序包外部的代码是隐藏的。

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 方法b>包-

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

当以上代码在SQL提示符下执行时,它将创建以上包并显示以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/plsql/plsql-packages.html

来源:LearnFk无涯教程网

Package created.

创建包主体

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

上面的示例使用了嵌套表。无涯教程将在下一章讨论嵌套表的概念。

当以上代码在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 

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出计算机组成原理 -〔徐文浩〕

小马哥讲Spring AOP编程思想 -〔小马哥〕

说透芯片 -〔邵巍〕

如何讲好一堂课 -〔薛雨〕

遗留系统现代化实战 -〔姚琪琳〕

云计算的必修小课 -〔吕蕴偲〕

快速上手C++数据结构与算法 -〔王健伟〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕

深入拆解消息队列47讲 -〔许文强〕

好记忆不如烂笔头。留下您的足迹吧 :)