PL/SQL 包

2025年4月6日 | 阅读6分钟

在本文中,我们将详细讨论 PL/SQL 包,以及各种功能、方法和示例。

什么是 Pl/SQL 包?

包是一种结构,允许您将过程、函数、变量、常量、游标和异常按逻辑分组到一个容器中。

PL/SQL 包包含两个组件

  • 包规范
  • 包体(可选)

创建包规范的语法如下:

在上面的语法中,CREATE PACKAGE 语句用于定义新的包规范,如果要重建现有包,则使用 REPLACE 关键字,<package_name> 是包的名称,包体对象声明是在其中列出将在包中创建的对象。 必须指定包规范。 包规范中声明的变量可以根据需要初始化为常量值或公式,否则默认初始化为 NULL。

包体包含实现包规范中定义的对象所需的所有代码。 它包含变量的声明和所有包模块的定义。 包体还可以包含一个可执行部分,称为初始化部分,因为它只运行一次以初始化包。

创建包体的语法如下:

在包编写、调试、编译并存储在数据库中之后,应用程序可以调用其子程序、使用其游标、引发其异常并引用其类型。

开发包需要遵循以下步骤。

  • 首先使用 CREATE PACKAGE 语句创建包规范。 然后我们将源代码编译为 P 代码。
  • 然后使用 SQL 脚本文件中的 CREATE PACKAGE BODY 语句创建包体。 然后我们编译此代码并检查是否发现错误。
  • 创建包规范及其包体后,可以使用点表示法从包规范外部引用在包规范中声明的对象。

示例 1

创建一个包,其中包含一个函数,用于返回给定员工代码的工资,一个过程,用于描述给定部门编号的员工,以及另一个过程,用于实现给定员工的工资?

要检查编写的代码是否正确,我们将运行上面的 Pl/SQL 代码块。 如果代码正确,它将显示消息“Package Created”,否则将显示错误,您可以使用 SHOW ERRORS 命令查看这些错误。

以下代码用于创建包体。

输出

@ Emp_Pack
Package Body Created 

说明

要检查包体的代码是否正确,我们将运行上面的 PL/SQL 代码块。

成功执行该程序后,包将显示消息“Package Created”。 如果发生任何错误,它将提示一条警告消息。 要检查错误,我们编写

SHOW ERRORS;

它将显示错误。 这里 Sal_Check 是一个公共函数,Emp_Info 和 Sal_Inc 是公共过程。 除了使用包规范声明并且可以在包体中定义的公共函数/过程之外,我们还可以拥有私有函数/过程。 私有结构在包体中声明和定义。

下图显示了上述 PL/SQL 代码的工作原理。

PL/SQL Packages

引用 PL/SQL 包内容

创建包规范及其包体后,可以使用点 (.) 表示法从该包规范外部引用在包规范中定义的对象,格式如下。

引用 PL/SQL 包内容的语法如下:

在上面的语法中,<package_name> 是声明的包的名称,<object_name> 可能包括过程、函数、变量、常量、游标和异常等。

引用 PL/SQL 包内容的示例是

示例 1

说明

执行上述语句后,它将显示与 empno=7499 对应的工资。 类似地,要引用过程 Emp_Info,我们编写。

示例 2

说明

执行上述语句后,它将显示属于 deptno=20 的员工的员工信息。

您还可以使用 PL/SQL 代码块来执行包中声明的过程、函数或其他对象。

说明

执行上面的代码后,它将提示您输入员工的姓名,然后返回其工资。 您可以在不同的模式中调用包的过程。 为此,您必须在包名称之前限定模式名称,并在两者之间放置一个点。

无包体的包

没有包体的包称为无包体的包。 此类包的包规范仅声明类型、常量、变量、异常和调用规范。 在此类包规范中声明的变量在用户会话期间存在。

重新编译包

带有 COMPILE 关键字的 ALTER Package 命令用于重新编译包,每当对包进行任何修改时。 重新编译包,在不更改包定义或其任何对象定义的情况下,重新编译包中定义的所有对象。

创建重新编译包体的语法如下:

现在假设我们对包体中定义的过程之一进行修改,那么您可以使用以下语句重新编译包体。

创建重新编译包体的示例如下:

包的优点

以下是 PL/SQL 中包的各种优点列表

  • 包使您能够更有效地将应用程序开发组织成命名的模块。 每个包都很容易理解,并且包之间的接口很简单。
  • 对包的所有访问都只能通过包规范中定义的公共过程和函数进行。 任何人都不能直接访问包体,这意味着我们可以根据需要更改包体,而不会使引用该规范的任何其他对象失效。
  • 当您第一次调用打包子程序时,整个包会加载到内存中。 在那之后,对包中相关子程序的后续调用不需要数据 I/O。 这可以提高性能。
  • 包通过使用包含存储过程和函数的库来促进代码重用。

关于 PL/SQL 包的 MCQ

1. 在以下语法中,哪个用于创建 PL/SQL 包?

  1. CREATE OR REPLACE PACKAGE <package_name>
    { IS| AS }
    END <package_name>;
  2. CREATE OR PACKAGE <package_name>
    { IS| AS }
    END <package_name>;
  3. CREATE OR REPLACE PACKAGE { IS| AS }
    END <package_name>;
  4. CREATE OR REPLACE PACKAGE <package_name>
    END <package_name>;
 

答案:a

说明: 以下语法用于创建 PL/SQL 包。


2. 以下哪个语句用于创建 PL/SQL 包体?

  1. CREATE
  2. CREATE BODY
  3. CREATE PACKAGE BODY
  4. CREATE PACKAGE
 

答案:c

说明: 以下语法用于创建 PL/SQL 包。


3. 以下哪个语句不是 PL/SQL 包的优点?

  1. 调试代码
  2. 可重用性
  3. 模块化
  4. 重载
 

答案:a

说明: 代码调试不是 PL/SQL 包的优点。


4. PL/SQL 包包含多少个组件?

  1. 1
  2. 2
  3. 3
  4. 4
 

答案:b

说明:PL/SQL 包包含两个组件

  • 包规范和包体