Oracle PackageOracle

yinhai_98 2011-05-19 11:39:33
.

一、程序包的相关知识
1.定义与说明
a. 相关对象的封装
b. 程序包的各部分
- 程序包规格说明
声明子程序
- 程序包主体
定义子程序

2.使用程序包的优点
- 模块化
- 更轻松的应用程序设计
- 信息隐藏
- 新增功能
- 性能更佳

3.公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数

公有项 私有项
可以在程序包之外引用 不能在程序包之外引用
是在程序包规格说明中定义的 是在程序包主体中定义的
用于全局目的 用于局部目的

二、程序包创建说明
1.程序包规格说明
(1)、使用Create Package命令进行创建
(2)、包含公用对象和类型
(3)、声明类型、常量、变量、异常、游标和子程序
(4)、可以在没有程序包主题的情况下存在
(5)、可以重载
- 程序包中的多个子程序可以具有相同的名称
- 它们的形参是不同的
- 只能位于打包的子程序中
- 限制
a. 如果子程序的参数仅名称或模式不同,则不能重载
b. 不能基于其返回类型重载子程序

2.程序包主体
(1)、使用Create Package body 命令进行创建
(2)、包含子程序和游标的定义
(3)、包含私有声明
(4)、不能在没有程序包规格说明的情况下独立存在

3.程序包的调用
包名.类型名;
包名.函数名[参数表];
包名..过程名[参数表];
(1)、 Package-name.type-name
(2)、 Package-name.object-name
(3)、 Package-name.subprogram-name
其中,Package-name 是程序包名称,type-name是类型名称,
object-name是对象名称,subprogram-name 是子程序名称
--示例
DBMS_output.put_line(Hello);
(4)、对于返回参数是游标类型的调用(如:引用游标)
set autoprint on --打开Sqlplus输出
variable tempCur RefCursor; --定义一个宿主类型的引用游标变量
exec StudentPackage.ReturnStudent(:tempCur); --执行带有引用游标的过程 注意使用宿主类型的变量前面要加“:”符号

4. 有关子程序和程序包的信息
A.数据字典
User_objects 用于检查对象是否存在
User_source 用于获取对象的代码

B. 包的修改和删除
Alter Package [Body] 包名
Alter Package Body StudentPackage;
Drop Package [Body] 包名
Drop Package Body StudentPackage;

5. 创建格式
A.创建包规格部分
格式:Create [or replace] Package 包名
IS|AS
变量声明;
类型定义;
异常声明;
游标声明;
函数说明;
过程说明;
Pragma restrict_references(过程名或函数名,WNDS[,WNPS][,RNDS][,RNPS]) --编译指令 限定函数的操作
End [包名];

B.创建包主体部分
格式: Create [or replace] package body 包主体名 --包主体名一定要是已经定义的包名
IS|AS
变量声明; --具体的实现部分
类型定义;
异常声明;
游标声明;
函数说明;
过程定义;
End [包主体名];

6. 示例

示例1.创建程序包的规格说明部分
Create or replace Package StudentPackage
is
Type curRefStudent is Ref Cursor Return Student%rowtype;
Procedure SelectStudent(FindID in Student.stuid%type);
Procedure InsertStudent(NewStudent in Student%rowType);
Procedure UpdateStudent(NewStudent in Student%rowType);
Procedure DeleteStudent(DelID in Student.stuid%type);
Procedure ReturnStudent(inOutstu in out curRefStudent);
Function RegurnRecordCount Return Number;
End studentPackage;
示例2.创建程序包的主体部分
Create or replace Package Body StudentPackage IS
Procedure SelectStudent (FindID in Student.stuid%type) as --注意没有Create
/*实现查询过程的定义*/
Cursor findCur is select * from student where stuid=FindID;
Begin
For S in FindCur Loop
DBMS_output.put_line(S.stuID||' '||s.StuName||' '||S.Sex);
End Loop;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('没有查到ID为'||FindID||'的记录!');
When Others Then
DBMS_output.Put_Line('查询过程中发生意外情况');
End SelectStudent; --结束查询过程

/*实现插入过程的定义*/
Procedure InsertStudent(NewStudent in Student%rowType) as
iRec Integer;
Not_Exists_Student Exception; --预定义异常
Begin
Select count(*) into iRec from student where stuid=NewStudent.stuID;
IF iRec>0 Then
Raise Not_Exists_Student;
Else
insert into student values(NewStudent.stuid,NewStudent.stuName,NewStudent.sex);
commit;
End IF;
Exception
When Not_Exists_Student Then
DBMS_output.Put_Line('要插入的编号:'||NewStudent.stuid||'的记录已经存在');
When Others Then
DBMS_output.Put_Line('插入记录操作过程中出现错误');
End InsertStudent;--结束插入过程

/*实现更新过程的定义*/
Procedure UpdateStudent(NewStudent in Student%rowType) as
iRec Integer;
Begin
select Count(*) into iRec From student Where stuid=NewStudent.stuid;
IF iRec =0 Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuid||'的记录不存在,修改失败');
ELSE
Update student Set Stuname=NewStudent.stuName,Sex=NewStudent.Sex
WHERE stuid=NewStudent.stuID;
Commit;
End IF;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuID||'的记录不存在,修改失败');
When Others Then
DBMS_output.Put_Line('执行修改操作时发生意外情况,修改未成功');
End UpdateStudent;--结束修改过程

/*实现删除过程的定义*/
Procedure DeleteStudent(DelID in Student.stuid%type) as
iRec Integer;
Begin
Select Count(*) into iRec From Student Where stuID=DelID;
IF iRec=0 Then
DBMS_output.Put_Line('编号为:'||DelID||'的记录不存在,删除操作时未成功');
ELSE
Delete From student Where stuid=DelID;
Commit;
DBMS_output.Put_Line('删除成功!');
End IF;
Exception
When Others Then
DBMS_output.Put_Line('执行删除操作时发生意外情况,删除未成功');
End DeleteStudent;

/*实现参数带有游标类型定义*/
Procedure ReturnStudent(inOutstu in out curRefStudent) as
Begin
Open inOutstu For Select * from student;
End ReturnStudent;

/*实现函数定义*/
Function RegurnRecordCount Return Number as
RecCount number(10);
Begin
Select Count(*) into RecCount From student;
Return recCount;
Exception
When Others Then
DBMS_output.Put_Line('查询表中记录数时发生意外情况');
End RegurnRecordCount; --结束函数的定义
End studentPackage;--结束包

示例3:调用包
1. 调用studentPackage包中的InsertStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='张三';
newStu.sex:='男';
studentPackage.InsertStudent(newStu);
End;
/
2. 调用studentPackage包中的UpdateStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='李四';
newStu.sex:='女';
studentPackage.UpdateStudent(newStu);
Exception
When Dup_Val_On_Index Then
DBMS_output.Put_Line('唯一约束被破坏');
When Others Then
DBMS_output.Put_Line('更新过程出现错误');
End;
/
3. 调用studentPackage包中的DeleteStudent过程
Begin
studentPackage.DeleteStudent('1001');
End;
/
4. 调用studentPackage包中的ReturnRecordCount函数
Begin
DBMS_output.put_Line(studentPackage.ReturnRecordCount);
End;
/
...全文
38 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
课程简介:Oracle 11G 完整的课程体系,从安装到入门到项目实战开发,整个学习过程,都以实践操作为主,大量的案例,实例,作业,来保证学习,练习,直到具备数据分析师,掌握SQL部分,能达到数据库开发工程师的能力要求与水平,SQL查询,数据库对象,索引,视图,分区表,优化等等实现从事数据分析师所具备的的数据处理能力,结合存储过程开发与使用,能更好的结合业务需求来完成对指标的统计与分析。 课程收益你将获得:    数据分析师SQL实战    掌握Oracle数据库全部技能    数据分析师入门操作    数据库开发工程师    独立开发数据库需求    SQL纯实战应用    具备数据处理,数据存储技能    具备数据仓库架构师思维与应用 1、建议每天保证2个小时学习时间,加以练习实操2、每节课后的练习案例动手实践,方能记忆深刻3、学完知识点后举一反三,应用到实际工作中 课程亮点:Oracle全集包含服务器搭建,客户端使用,入门步骤,SQL各查询实现,条件查询,分组,聚合函数,正则表达式,高级函数,连接查询,多表查询,子查询,数据插入,更新,删除,数据库对象,如表,视图,索引,同义词,分区表,存储过程,存储过程大量案例,项目开发等等内容丰富,各知识点都配置相应的作业及解答过程,真正实例与案例操作,学会Oracle各种操作,满足实际业务工作需要,真正做到事半功倍,以实践工作出发完成各知识点的学习与应用,掌握数据库相关的技能 适合人群: 数据分析师,数据库开发人员,技能提升,数据库应用,在校学生,零基础入门,项目开发,初,中,高级数据库开发工 程师,ETL开发,数据仓库架构,数据运维,企业开发,数据管理,数据质量等。 老师介绍:SUN老师高级数据分析专家,有着丰富的BI项目开发工作经验,具备数仓各方面的数据治理,指标开发,业务梳理,口径开发,曾相继在中国移动,亚信,文思任职高级项目开发,专业领域BI,数据分析,维度与指标展示,数仓流程开发,可视化等相关技术 ,有完备的数据分析理论知识与应用,在数据分析,数据处理,数据可视化数据建模等应用,指标统计,维度分析,多维分析等有深入研究,具备更严谨的实践技能操作。 课程大纲:

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧