---
title: "程序包 | OceanBase 文档中心"
description: 程序包 程序包 Package（简称包）是一组相关的子程序，包括子程序使用的游标和变量，一起存储在数据库中作为一个结合单元来使用。 OceanBases 数据库提供了许多系统包，这些包扩展了数据库功能，您可以在创建应用程序的时候使用系统包。例如，DBMS_RANDOM 包可以很容易的获取一个随机值。 PL 包的优点 …
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.4 企业版 LTS

# 程序包

更新时间：2026-06-15 20:48:44

程序包 Package（简称包）是一组相关的子程序，包括子程序使用的游标和变量，一起存储在数据库中作为一个结合单元来使用。

OceanBases 数据库提供了许多系统包，这些包扩展了数据库功能，您可以在创建应用程序的时候使用系统包。例如，DBMS_RANDOM 包可以很容易的获取一个随机值。

## PL 包的优点

PL 包为开发应用程序提供了很多便利和优势。优点如下：

- 封装功能

  包具有面向对象程序设计语言的特点，您可以将存储过程、变量、自定义数据类型等封装在一个包内，这样更容易组织和管理这些更小的单元。包类似于 C++ 和 Java 语言中的类，其中变量相当于类中的成员变量，存储过程和函数相当于类方法。包封装还简化了权限管理，授予包的访问权限，被授予者就可以访问包内的各个结构。
 - 较高的数据安全性

  包内定义的变量、游标、存储过程可以设置为公共的或私有的，"公共"表示包的用户可以直接访问它，"私有"表示包的用户不可以直接访问它。

  例如，一个包有三个变量和五个存储过程，您可以将两个变量和三个存储过程设置为私有的，那么这两个变量和三个存储过程只能在包体内访问，包的使用者只能访问剩下的一个变量和两个存储过程。

## 创建包

创建包需要两部分内容，包头和包体。包头需要声明所有公共的结构，而包体需要定义包的所有结构，包括公共部分和私有部分。

如下示例中，创建了一个 `students` 表，和 `students_adm` 的包。包中有两个存储过程，当有学生入学时，调用`students_adm.stu_entrance` 会往 `students` 表中插入学生的信息，当有学生毕业时，调用 `students_adm.graduate` 会从 `students` 表中删除学生的信息。

```sql
CREATE TABLE students (id INT, name VARCHAR2(100), class INT, grade INT, dorm VARCHAR2(100), year INT);

CREATE OR REPLACE PACKAGE students_adm AS
  PROCEDURE stu_entrance(id INT, name VARCHAR2, class INT, grade INT, dorm VARCHAR2, year INT);
  PROCEDURE graduate(id INT);
END students_adm;
/

CREATE OR REPLACE PACKAGE BODY students_adm AS
 PROCEDURE stu_entrance(id INT, name VARCHAR2, class INT, grade INT, dorm VARCHAR2, year INT) AS
  BEGIN
    INSERT INTO students VALUES (id, name, class, grade, dorm, year);
  END;
PROCEDURE graduate(id INT) AS
  BEGIN
    DELETE from students s WHERE s.id = id;
  END;
END students_adm;
/

obclient> CALL students_adm.stu_entrance(1001, 'Curry', 5, 10, '1-1-3', 12);
Query OK, 0 rows affected

obclient> SELECT * from students WHERE id = 1001;
+------+-------+-------+-------+-------+------+
| ID   | NAME  | CLASS | GRADE | DORM  | YEAR |
+------+-------+-------+-------+-------+------+
| 1001 | Curry |     5 |    10 | 1-1-3 |   12 |
+------+-------+-------+-------+-------+------+
1 row in set

obclient> CALL students_adm.graduate(1001);
Query OK, 0 rows affected

obclient> SELECT * from students WHERE id = 1001;
Empty set

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
