首页 > 其他分享 >包

时间:2023-07-13 10:35:40浏览次数:24  
标签: DBMS 定义 package 存储 包体 函数

包是用来存储相关程序结构的对象,它存储于数据字典中。包由两个分离部分组成,包头(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语句

 

标签:,DBMS,定义,package,存储,包体,函数
From: https://www.cnblogs.com/xjianbing/p/17549715.html

相关文章