包
包是用来存储相关程序结构的对象,它存储于数据字典中。包由两个分离部分组成,包头(PACKAGE)和包体(PACKAGE BODY)。包头是包的说明部分,是对外的操作接口,对应用是可见的;包体是包的代码和实现部分,对应用来说是不可见的黑盒。
就是装对象的对象,可以装存储构成,游标,函数,变量,常量,等等....
作用:解决命名空间,名称冲突
包中包含的程序结构
程序结构 | |
---|---|
过程(procedure) | 带参数的命名程序模块 |
函数(function) | 带参数,具有返回值的命名程序模块 |
变量(variable) | 存储变化的量的存储单元 |
常量(constant) | 存储不变的量的存储单元 |
游标(cursor) | 用户定义的数据操作缓存区,在可执行部分使用 |
类型(type) | 用户自定义的数据结构类型 |
异常(exception) | 在标准中定义或由用户自定义,用于处理程序错误。 |
说明部分可以出现在包的三个不同的部分:出现在包头中的称为公有元素,出现在包体中的称为私有元素,出现在包体的过程(或函数)中的称为局部变量。它们的性质有所不同
包中元素的性质
元素 | 说明 | 有效返回 |
---|---|---|
公有元素(public) | 在包头中说明,在包体中具体定义 | 在包外可见并可以访问,对整个应用的全过程有效 |
私有元素(private) | 在包体的说明部分说明 | 只能被包内部的其他部分访问 |
局部变量(local) | 在存储过程或函数的说明部分说明 | 只能在定义变量的(过程或函数)中使用 |
包有以下优点
-
包可以方便的将存储和函数组织到一起,每个包又是相互独立的,不同的包中,过程函数可以重名,这解决了在同一个用户环境中命名的冲突问题
-
包增加了对存储过程和函数的安全管理,对整个包的访问权只需一次授予。
-
同一个会话中,公有变量的值将被保留,知道会话结束。
-
区分了公有过程和私有过程,包体的私有过程增加了过程和函数的保密性。
-
包在首次被调用是,就作为一个整体被全部调入内存,减少了多长访问过程或函数的I/O次数。
包和包体的创建
-
包头的创建语句
CREATE [OR REPLACE] PACKAGE 包名
{as|is}
公有变量定义
公有类型定义
公有游标定义
公有异常定义
函数说明
过程说明
end;
-
包体的的创建简要语法:包体需要把包里的存储和函数详细定义;
create [or replace] package body 包名
{as|is}
私有变量定义
私有类型定义
私有游标定义
私有异常定义
函数定义
过程定义
end;
-
包的其他操作命令
---删除包头
drop package 包头名;
---删除包体
drop package body 包体名;
使用包中的变量
包名.对象名
--eg1
/*创建自己的包*/
create or replace package myemp_package
is
PI constant number:=3.1415269; ---声明常量
idss varchar2(20);-----声明变量
type my_type is table of varchar2(20) index by binary_integer;--声明table集合变量
type my_cursor is ref cursor;---声明游标变量,动态游标
procedure cs_empchangtel2( phone in out varchar2);--声明存储过程
function cs_mysum(a number,b number) return number;---声明函数
myexcep exception;----声明异常
end ackage myemp_package;
--eg2
/**创建自己的包体*/
create or replace package body myemp_package
is
/*定义存储*/
procedure cs_empchangtel2( '86'||phone; in out varchar2)
is
bein
dbms_output.put_line('号码:'||phone);
phone:='86'||phone;
end cs_empchangtel2;
/*定义函数***/
function cs_mysum(a number,b number) return number
is
c number;
begin
c:=a+b;
return c;
excepion
when others then
dbms_output.put_line('数据操作失败'||sqlcode||','||sqlerrm)
end cs_mysum;
end myemp_package;
/*包里的存储过程的调用**/
declare
tel varchar2(20):='13103310';
begin
myemp_package.cs_empchangtel2(tel);---因为该定义函数是in out 函数需要传递一个变量进去,所以在无名块中使用不能用execute调用。
dbms_output.put_line('号码变更个为:'||tel);
end;
---输出为
/*
号码 13103310
号码变更个为: 8613103310
*/
/*包里的函数使用*/
select myemp_package.cs_mysum(1,2) from dual; ---输出为3;
/*集合变量的使用*/
declare
my_t myemp_package.myemp_package;----类型可直接使用
begin
my_t(1):='helloworld';
dbms_output.put_line(my_t(1));
end;
常用系统包
系统包 | 说明 |
---|---|
DBMS_OUPUT | 在sql*plus环境下输出信息 |
DBMS_DDL | 编译过程函数和包 |
DBMS_SESSION | 改变用户的会话,初始化包等 |
DBMS_TRANSACTION | 控制数据库事务 |
DBMS_MAIL | 连接orale*mail |
DBMS_LOCK | 进行复杂的锁机制管理 |
DBMS_ALERT | 识别数据库事务告警 |
DBMS_PIPE | 通过管道在会话间传递信息 |
DBMS_JOB | 管理oracle的作业 |
DBMS_LOB | 操纵大对象 |
DBMS_SQL | 执行动态sql语句 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!