Oracle PackageOracle

yinhai_98 yinhai_98 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
.

一、程序包的相关知识
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;
/
...全文

相关推荐

产业园区如何提升科技企业技术需求匹配精准度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis

Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis

will_net

cover_1793582495122.png

cover_1793582495122.png

2601_97129411

国央企创新负责人如何高效配置分散的科技创新资源?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

【新能源预测】项目介绍 MATLAB实现基于GWO-VMD-SSA-LSTM灰狼优化算法(GWO)结合变分模态分解(VMD)、麻雀搜索算法(SSA)及长短期记忆网络(LSTM)进行光伏电站超短期功率预

内容概要:本文提出一种结合灰狼优化算法(GWO)、变分模态分解(VMD)、麻雀搜索算法(SSA)和长短期记忆网络(LSTM)的混合模型,用于提升光伏电站超短期功率预测精度。通过GWO优化VMD的关键参数(模态数与惩罚因子),实现对非平稳功率序列的自适应多尺度分解,分离趋势、波动与噪声成分;各模态分量经归一化后,利用SSA优化LSTM网络的超参数(如隐藏单元数、学习率等),提升模型拟合与泛化能力;最后对各模态预测结果重构并评估。模型在MATLAB中实现,包含完整数据清洗、特征构造、参数寻优、训练预测与多指标评价流程,强调工程可维护性与抗数据泄漏能力。; 适合人群:具备一定机器学习与时间序列分析基础,熟悉MATLAB编程,从事新能源预测、智能电网、电力系统调度等相关领域的科研人员与工程技术人员,尤其适合有1-3年项目经验的研发人员; 使用场景及目标:①应对多云、快速辐照变化等复杂天气下的光伏功率剧烈波动,提升超短期(15分钟至4小时)预测精度;②构建可适应不同季节、地域和电站类型的自适应多尺度预测体系;③支撑电网调度、储能协同控制与爬坡事件预警,提升新能源消纳能力与系统稳定性; 阅读建议:此资源以实际MATLAB代码为基础,建议读者结合文中示例逐步复现模型流程,重点关注GWO与SSA在双层优化中的分工、VMD分解的质量控制、时间序列样本构造的防泄漏设计以及多模态预测重构策略,调试过程中注意参数边界设置与随机种子固定,以确保结果可重复。

nantangyuxi
评论
收藏 已收藏
分享
返回顶部
yinhai_98
非技术区 7,776 成员 63,111 内容