基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
程序包
更新时间: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 表中删除学生的信息。
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