--________________________________开发包______________________________________________________
--包 :组合逻辑相关的PL/SQL 类型(table 类型,record 类型,游标和游标变量, 过程和函数) 提高性能,隐藏信息(私有),子程序重载
--1.创建包 (包:由包规范 和包体 组成, 创建包是要首先创建包规范 ,然后 包体) 实际上包规范是包与应用程序之间的接口
--A 首先 创建包规范 create package
--语法:
create [or replace] package package_name --package_name 指定包名
is|AS --用于定义共有组件
public type end item declareations
subprogram specifications
end package_name;
--示例
create or replace package emp_package --定义emp_package
As
g_deptno number(3):=30; --定义公有变量
procedure pro_add_employee --定义公有的 过程
(
param_empno number,
param_ename varchar2,
param_sal number,
param_deptno number:=g_deptno
)
--定义公有的函数fun_get_sal;
function fun_get_sal(param_empnno number)return number;
--***过程和函数 都没有给出具体的实现 所以 公有的函数和过程 只有在创建了包体后才能调用
END emp_package;
--B: 创包体; create package body (实现包规范中定义的过程和函数) 可以定义私有的组件(变量,常量,过程, 函数)只能在包体中使用
--语法
create [or replace] package body package_name --package_name用于指定包名 和包规范名称一样
iS|AS --定义自由组件的开始 并实现公有的函数和过程
private type and item declarations subprogram bodies
end package_name;
--示例 1
create or replace package body emp_package --创建包体名
As
--定义私有的 函数
function fun_vallidate_dept(param_deptno number)
return boolean
as
v_temp number;
begin
select 1 into v_temp from dept where deptno=param_deptno;
return true;
Exception
when no_data_found then
return false;
END;
--实现 包规范中的 pro_add_employee 过程
procedure pro_add_employee
(
param_name number,
param_ename varchar2,
param_sal number,
param_deptno number:=g_deptno
)
AS
begin
if fun_vallidate_dept(param_deptno) then --调用了同一包中的 组件 fun_vallidate_dept
insert into emp(empno,ename,sal,deptno) values(param_empno,param_ename,param_sal,param_deptno);
else
raise_application_error(-2000,'不存在该部门!');
end if;
Exception
when DUP_VAL_On_index then
raise_application_error(-2002,'该员工编号已经存在!');
end;
--实现公有函数fun_get_sal
function fun_get_sal(param_empno number) return number
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=param_empno;
return v_sal;
Exception
wher no_data_found then
raise_application_error(-2000,'该员工不存在!');
end;
end emp_package;
--在同一包中调用
直接调用(如上示例 的 pro_pro_add_employee): fun_vallidate_dept
--调用包的公用变量
begin
emp_package.g_deptno:=20;
end;
--调用包的公有过程
begin
emp_package.g_deptno:=20;
emp_package.proc_add_employee(8888,'chen',3000);
emp_package.proc_add_employee(8889,'yaun',3000,30);
end;
--调用包的公用函数 (要定义变量来接受返回值)
declare
v_sal emp.sal%type;
begin
v_sal:=emp_package.fun_get_sal(7788);
DBMS_OUTPUT.put_Line('员工7788的工资是:'||V-sal);
end;
--不同用户调用包的公用组件 (要有权限)
grant execute on emp_package to hr;
conn hr/hr@oracl;
begin
scott.emp_package.pro_add_employee(2010,'tiger',2000);
end;
--查看包的源代码
conn scott/tiger@orcl
select text from user_source where name='emp_package' and type='package';
--删除包
drop package emp_package;
--__________________________________游标___________________________________________---
--游标分为 1.隐含游标:(处理 select into 和DML语句)
--2.显示游标: (处理select 语句返回多行数据)
--显示游标 (定义游标declare,打开游标open,提取数据fethch,关闭游标close)
--1.定有游标 (在使用显示游标的时候,必须首先在定义部分定义游标,用于定义游标所对应的select语句)
--语法
cursor cursor_name is select_statement; --cursor_name 游标的名称,select_statement:指定游标对应的select 语句
--2.打开游标 (打开游标的时候,oracle 会执行游标所对应的select 语句,将select语句的结果暂时放在结果集中)
open cursor_name; --cursor_name :必须在定义部分定义已经定义了的游标
--3.提取数据 (oracle 9i之前 fetch 每次只能提取一行数据 在oracle 9i 之后 通过fetch ....bulk collect into 语句一次可提取多行数据)
fetch cusor_name into variable1,variable2,....; --variavle:用于指定接受游标数据的变量
--或者
fetch cusor_name bulk collect into colllec1,collect2,.....; --collect:用于指定接受游标结果的集合变量
--4.关闭游标
close cusor_name;
--显示游标的属性 (返回显示游标的执行信息 包括 %isopen,%found,%notfound,%rowcount)
--1.isopen (判断游标是否已经打开)
if cusor_name %isopen then
执行语句
else
open cusor_name;
end if;
--2.%found (检测是否从数据集中提取到数据,提取到 返回true)
LOOP
fetch cusor_name into var1,var2;
if cusro_name%fount then
执行语句;
else
exit;
end if;
ENd LOOP;
--3.%notfound (检测是否从数据集中提取到数据,没有提取到 返回true)
LOOP
fetch cusor_name into var1,var2;
exit when cusor_name%notfound;
....
END LOOP;
--4.%rowcount (返回到当前行为止,已经提取到的世纪行数)
LOOP
fetch cusor_name into var1,var2;
if cusor_name%rowcount>n then --执行提取数据的行数大于n时候,要执行的语句
.....
END if;
exit
when cusor_name%notfound;
END LOOP;
--显示游标的使用示例
--1.在显示游标中使用 fetch ....into ..语句 (fetch ...into.. 每次只能提取一行,要处理结果集中多行数据,必须使用循环语句);
declare
cursor emp_cursor is select ename,sal from emp where deptno=30;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor;
Loop
fetch emp_cursor into v_name,v_sal;
exit when emp_cursor%notfound;
DBMS_OUTPUT.put_line(v_name||' '||v_sal);
end LOOP;
close emp_cursor;
end;
--2.在显示游标中,使用fetch...bulk collect into提取所有的数据
declare
cursor emp_cursor is select ename,sal from emp where deptno=10;
type emp_record is record
(
ename emp.ename%type,
sal emp.sal%type
);
type ename_table_type is table of emp_record;
v_name_table ename_table_type;
begin
open emp_cursor;
fetch emp_cursor bulk collect into v_ename_table;
close emp_cursor;
for i in v_ename_table.first..v_emp_table.last llllllllllllllllllll.
LOOP
DBMS_OUTPUT.put_line(v_ename_table(i).ename||' '||v_ename_table(i).sal);
END loop;
END;
--3.在游标中使用属性
cursor emp_cursor is select ename from emp where deptno=10;
type ename_table_type is table of varchar2(10);
v_ename_table ename_table_type;
begin
if not emp_cursor%isopen then
open emp_cursor;
end if;
fetch emp_cursor bulk collect into v_name_table;
DBMS_OUTPUT.put_line('提取的总行数'||emp_cursor%rowcount);
close emp_corsor;
end;
--4.基于游标定义记录变量 (%rowtype可以基于表和视图定义记录变量,还可以基于游标定义记录变量)
declare
cursor emp_cursor is select ename,sal from emp where deptno=10;
emp_record emp_cursor%rowtype;
begin
open emp_cursor;
LOOP
fetch emp_cursor into emp_record;
exit when emp_cursor¬found;
DBMS_OUTPUT.put_line(emp_record.ename||' '||emp_record_sal);
end LOOP;
end;
--5.参数游标 (使用不同参数多次打开游标可以生成不同的结果集)
cursor cursor_name(parameter_name datatype) is select_statement;
--示例
declare --下面 定义了带参数的游标 指定数据类型不能指定长度
cursor emp_cursor(param_dept number) is select ename,sal from emp where deptno=param_dept;
emp_record emp_cursor%rowtype;
begin
open emp_cursor(10); --打开游标时候 传入参数 (10) 表示查询 部门编号为10 的所有员工的姓名和工资
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
DBMS_OUTPUT.put_line(emp_cursor.ename||' '||emp_cursor.sal);
end loop;
close emp_cursor;
end;
--6.是有游标更新或删除数据 (在定义游标时候 带有for update)
--语法
cursor cursor_name(param_naem datatype) is select_statement for update [nowalt];
--更新数据
declare
cursor emp_cursor is select ename,sal from emp for update;
v_emp_row emp_cursor%rowtype;
v_update_emp_count number(2):=0;
begin
open emp_cursor;
LOOP
fetch emp_cursor into v_emp_row;
exit when emp_cursor%notfound;
if v_emp_row.sal<2000 then
update emp set sal=sal+100 where current of emp_cursor;
v_update_emp_count:=v_update_emp_count+1;
end if;
end LOOP;
dbms_output.put_line('共有'||v_update_emp_count||'名员工被更新了!');
close emp_cursor;
end;
--使用游标删除数据
declare
cursor emp_cursor is select deptno form emp for update;
v_emp_row emp_cursor%rowtype;
v_update_emp_count mumber(2):=0;
begin
open emp_cursor;
loop
fetch emp_cursor into v_emp_row;
exit when emp_cursor%notfound;
if v_emp_row.deptno=30 then
delete emp where current of emp_currsor;
v_update_emp_count:=v_update_emp_count+1;
end if;
end loop;
DBMS_OUTPUT.put_Line('共有'||v_update_emp_count||'名雇员删除了!');
close emp_cursor;
end;
declare
cursor emp_cursor is
select ename,sal from emp form update nowalt;
v_emp_row emp_sursor%RowType;
u_upate_emp_count number(2):=0;
begin
open emp_cursor;
loop
fetch emp_cursor into v_emp_row;
exit when emp_cursor%notfound;
if v_emp_row.sal<2000 then
update emp set sal=sal+100 where current of emp_cursor;
v_updae_emp_count:=v_update_emp_count+1;
end if
end loop;
dbms_output.put_line('共有'|| _update_emp_count||‘员工被更新了 !’);
close emp_cursor;
end
--游标for 循环
declare
--定义游标
cursor emp_cursor is select ename,sal form emp;
begin
for emp_row in emp_cursor loop
dbms_output.put_line('第'||emp_cursor%RowCount ||'个员工:'||emp_row.ename);
end loop;
end;
在for 游标中直接使用 子查询
begin
for emp_row int (select ename,sal form emp) loop
ebms_output.put_line(emp_row.ename);
end loop;
end;
--使用游标变量
定义ref cursor 类型 和游标变量
type ref_type_name is ref cursor;
cursor_variable ref_type_name;
--游标变量使用
依次显示部门编号为30 的所有员工的 说明使用游标变量的方法
declare
TYPE emp_cursor_type is REF CURSOR;
emp_cursor emp_cursor_type;
emp_row emp%ROWTYPE;
begin
open emp_cursor for
select * from em where deptno=30;
loop
fetch emp_cursor into emp_row;
exit when emp_cursor%notfound;
dbms_output.put_line('第'||emp_cursor%RowCount||'个员工:'||emp_row.ename);
end loop;
close emp_cursor;
end;
---使用游标变量开发返回结果集的子程序
create or replace procedure proc_getEmpsByDeptNO
(
param_deptno number,
param_resultset out SYS_REFCURSOR
)
as
begin
open param_resultset for
select ename,sal from emp where deptno=param_deptNo;
end;
declare
TYPE emp_record_type is record
(
ename varchar2(20),
sal number(7,2)
) ;
v_emp_rows SYS_REFCURSOR;
v_deptno number(2):=30;
v_emp_row emp_record_type;
begin
pro_getEmpByDeptno(v_deptno,v_emp_rows);
LOOP
fetch v_emp_Row into v_emp_row;
exit when v_emp_rows%NOTFOUND;
DBMS.output.put_line('第'||v_emp_rows%rowcount||‘员工 名称’||v_emp_row.ename||'工资'||v_emp.row.sal);
end loop;
close v_emp_rows;
end;
--开发返回结果集的函数
create or replace function fun_getEmpByDateYear
(
param_hireDareYear number
)
return sys_REFCURSOR
as
param_resultset sys_REFCUSOR;
begin
open param_resultset for
select ename,sal from emp where EXTRACT(Year from hrdare )=param_hirdDateYear;
return param_resultset;
end
declare
TYPE emp_record_Type is record
(
ename varchar2(20);
sal number(7,1)
);
v_emp_rows SYS_REFCURSOR;
v_hireDateYear number(4):=1981;
v_emp_row emp_record_type;
begin
v_emp_rows:=fun_getEmpsByHireDateYear(v_hireDateYear);
loop
fetch v_emp_rows into v_emp_row;
exit when v_emp_rows%NOTFOUND;
DBMS.output.put_line('第'||v_emp_rows%rowcount ||'个员工的名称:'||v_emp_row.name||'工资'||v_emp_row.sal);
end loop;
close v_emp_rows;
end;
--隐含游标的属性 (SQL%FOUND SQL%NOTFOUND SQL%rowcount SQL%isopen)
1 :SQL%FOUND
decare
v_empno number(4):=7788;
begin update emp set empno=v_empno where empno=v_empno;
if sql%fount then
dbms_out.put.put_line('存在该员工');
else
dbms_output.put_line('不存在该员工');
end if;
end ;
2: SQL%NOTFOUND 与 SQL%FOUND 相反
3: declare
v_deptno number(2):=20;
v_rows_count number;
begin updare emp set sal =sal+100 where deptno=v_deptno;
v_row_count:=Sql%rowCount;
if v_rows_count =0 then
dbms_output.put_line('没有员工被更新!');
else
dbms_output.put_line('共有:'||_rows_count||'个员工被更新了!');
end if;
end;
分享到:
相关推荐
GUI面板MATLAB香烟汉字识别
2023年统招专升本计算机考试真题及答案6.pdf
Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)
Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4
Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)
MATLAB设计的危险区域预警系统(GUI界面设计)
2023年江苏省计算机二级VB试卷.pdf
NSCBx1.0.1b Keys19.0.0.zip
智慧园区,作为现代化城市发展的新兴模式,正逐步改变着传统园区的运营与管理方式。它并非简单的信息化升级,而是跨越了行业壁垒,实现了数据共享与业务协同的复杂运行系统。在智慧园区的构建中,人们常常陷入一些误区,如认为智慧园区可以速成、与本部门无关或等同于传统信息化。然而,智慧园区的建设需要长期规划与多方参与,它不仅关乎技术层面的革新,更涉及到管理理念的转变。通过打破信息孤岛,智慧园区实现了各系统间的无缝对接,为园区的科学决策提供了有力支持。 智慧园区的核心价值在于其提供的全方位服务与管理能力。从基础设施的智能化改造,如全面光纤接入、4G/5G网络覆盖、Wi-Fi网络及物联网技术的运用,到园区综合管理平台的建设,智慧园区打造了一个高效、便捷、安全的运营环境。在这个平台上,园区管理方可以实时掌握运营动态,包括道路状况、游客数量、设施状态及自然环境等信息,从而实现事件的提前预警与自动调配。同时,智慧园区还为园区企业提供了丰富的服务,如项目申报、资质认定、入园车辆管理及统计分析等,极大地提升了企业的运营效率。此外,智慧园区还注重用户体验,通过信息发布系统、服务门户系统及各类智慧应用,如掌上营销、智慧停车、智能安防等,为园区员工、企业及访客提供了便捷、舒适的生活与工作体验。值得一提的是,智慧园区还充分利用大数据、云计算等先进技术,对园区的能耗数据进行采集、分析与管理,实现了绿色、节能的运营目标。 在智慧园区的建设过程中,还涌现出了许多创新的应用场景。例如,在环境监测方面,智慧园区通过集成各类传感器与监控系统,实现了对园区水质、空气质量的实时监测与预警;在交通管理方面,智慧园区利用物联网技术,对园区观光车、救援车辆等进行实时定位与调度,提高了交通效率与安全性;在公共服务方面,智慧园区通过构建统一的公共服务平台,为园区居民提供了包括平安社区、便民社区、智能家居在内的多元化服务。这些创新应用不仅提升了园区的智能化水平,还为园区的可持续发展奠定了坚实基础。同时,智慧园区的建设也促进了产业链的聚合与发展,通过搭建聚合产业链平台,实现了园区内企业间的资源共享与合作共赢。总的来说,智慧园区的建设不仅提升了园区的综合竞争力,还为城市的智慧化发展树立了典范。它以用户需求为导向,以技术创新为驱动,不断推动着园区向更加智慧、高效、绿色的方向发展。对于写方案的读者而言,智慧园区的成功案例与创新应用无疑提供了宝贵的借鉴与启示,值得深入探索与学习。
一、系统需求分析 1 (一)需求概述 1 (二)业务流分析 1 (三)数据流分析 3 (四)数据字典 3 二、数据库概念结构设计 5 (一)实体分析 5 (二)属性分析 5 (三)联系分析 6 (四)概念模型分析(.PDM图) 7 三、数据库逻辑结构设计 8 (一)概念模型转化为逻辑模型 8 1.一对一关系的转化 8 2.一对多关系的转化 8 3.多对多关系的转化 8 (二)逻辑模型设计(.PDM图) 8 四、数据库物理实现 9 (一)表设计 9 (二)创建表和完整性约束代码设计 10 (三)创建视图、索引、存储过程和触发器 11 五、数据库功能调试 12 (一)职工管理模块 12 (二)工程负责人管理模块 13 (三)系统管理员管理模块 15 六、设计系统前台软件 20 (一)开发软件选择 20 (二)软件功能要求与设计 21 (三)软件功能实现 21 (四)系统测试 27 七、设计总结 28
ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文
【人机交互】MATLAB手势识别设计
【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行)
2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf
ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文
【人机交互】MATLAB信号与系统数字信号设计
Delphi 12.3控件之Chatbox-1.9.8-Setup.rar
HD_Speed是一款非常小巧好用的实时磁盘读取速度测试软件。它可以比较准确地测试到磁盘的持续传输率和突发传输率一定程度上反映系统的磁盘性能,可以测试软盘、硬盘、光驱。并用曲线图方式体现出来,用它可以很直观的看出您的硬盘到底有多快而且也可以很方便的看出光驱的加速曲线。并且作为一款免费软件,测试也相当简单,大家有兴趣可以测试一下自己的磁盘性能。 HD_Speed绿色版 HD_Speed绿色版功能介绍 ●任何目录可以在Finder(即在本地机器上,一个外部驱动器或远程服务器上)可以选择立即分析。 ●自由航行在一个文件夹或子目录的分析装置。 ●平滑的动画之间的转换选定的目录管理。 ●移动鼠标到一个文件中看到它的名称和尺寸。 ●使用上下文菜单中选择文件的垃圾。 ●快速搜索文件名。 ●保存您最喜爱的位置和访问他们在主窗口中单击。
Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:jsp 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4
GUI面板MATLAB芯片字符识别