2022年Oracle的存储过程及游标 .pdf

上传人:C****o 文档编号:33386325 上传时间:2022-08-10 格式:PDF 页数:5 大小:42.83KB
返回 下载 相关 举报
2022年Oracle的存储过程及游标 .pdf_第1页
第1页 / 共5页
2022年Oracle的存储过程及游标 .pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《2022年Oracle的存储过程及游标 .pdf》由会员分享,可在线阅读,更多相关《2022年Oracle的存储过程及游标 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Oracle 的存储过程及游标Oracle 中的存储过程和游标 : select myFunc( 参数 1, 参数 2.) to dual; -可以执行一些业务逻辑一:Oracle 中的函数与存储过程的区别: A:函数必须有返回值 , 而过程没有 . B:函数可以单独执行 . 而过程必须通过execute 执行. C:函数可以嵌入到 SQL语句中执行 . 而过程不行 . 其实我们可以将比较复杂的查询写成函数. 然后到存储过程中去调用这些函数. 二: 如何创建存储过程 : A:格式create or replace procedure ( 参数名参数类型以及描述 ,.) -注意, 没有返回值is

2、 变量声明 begin 过程处理 ;-null; exception when 异常名 then end; 注意: 参数中默认是按值传递 . 是 in 方式. 也可以是 out 和 in out方式. 这些特点和函数一样 . B:举例 1: create or replace procedure myPro-create or replace proc myPro 出错 不能简写(a in int:=0,b in int:=0) is c int:=0; begin c:=a+b; dbms_output.put_line(C is value|c); end; 执行: execute myP

3、ro(10,20); -在 Sql Server中. 执行存储过程是不需要括弧的.注意 分号不要调了 . exec myPro(10,20); -可以简写C:举例 2: 如果在一个函数里面包含Select 语句的话 , 那么该 Select 语句必须有 into, 过程同样也需要 . create or replace procedure myPro1 (a int:=0,b int:=0) is 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - -

4、 - - - - c int:=0; begin select empno+a+b into c from emp where ename=FORD; dbms_output.put_line(C is values |c); end; 执行: execute myPro1(10,20) D:假如在一个过程里面要返回一个结果集,怎么办?大家注意 . 就必须要用到游标了! 用游标来处理这个结果集 . create or replace procedure Test ( varEmpName emp.ename%type ) is begin -会报错 . 错误原因没有 into 子句. sele

5、ct * from emp where ename like %|varEmpName|%; end; 这个程序我们无法用into ,因为在 Oracle 里面没有一个类型去接受一个结果集. 这个时候我们可以声明游标对象去接受他. PL/SQL游标: A:分类: 1: 隐式游标 : 非用户明确声明而产生的游标. 你根本看不到 cursor 这个关键字. 2: 显示游标 : 用户明确通过 cursor 关键字来声明的游标 . B:什么是隐式游标 : 1: 什么时候产生 : 会在执行任何合法的SQL语句(DML-INSERT UPDATE DELETE DQL-SELECT)中产生. 他不一定存放

6、数据 . 也有可能存放记录集所影响的行数. 如果执行 SELECT 语句, 这个时候游标会存放数据 . 如果执行 INSERT UPDATE DELETE 会存放记录影响的行数 . C:隐式游标叫什么名字 : 名字叫 sql 关于 sql 的游标变量到底有哪些呢 ? 作用: 返回最近一次执行SQL语句所涉及的游标相关信息. 因为每执行一次SQL语句,都会产生一个隐式游标. 那么当前执行的SQL语句就是当前的隐式游标 . sql%found sql%notfound sql%rowcount sql%isopen D:关于隐式游标的例子 : 名师资料总结 - - -精品资料欢迎下载 - - -

7、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - create table 学生基本信息表( StuID int, StuName varchar2(20) ) alter table 学生基本信息表 add constraint PK_STUID primary key(StuID) declare num int:=0; begin num:=# delete from 学生基本信息表 where StuID=num; if sql%notfound then dbms_

8、output.put_line(该行数据没有发现 ); else dbms_output.put_line(数据被发现并删除 , 影响的行数为:|sql%rowcount); end if; end; E:关于显示游标的例子 : 1: 如何定义显示游标declare cursor is select语句; declare cursor mycur is select empno,ename,job from scott.emp; 2: 如何打开游标 : open ; open mycur; 3: 如何通过游标来读取数据fetch into 4: 如何关闭游标 : close ; close m

9、ycur; 注意: 在 Oracle 中, 不需要显示销毁游标 . 因为在 Oracle 中, 很多东西是由 JAVA写的.Oracle 会自动销毁游标 . 5: 举例: declare cursor mycur is select empno,ename,job from emp; vempno emp.empno%type; vename emp.ename%type; vjob emp.job%type; begin open mycur; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

10、- - 第 3 页,共 5 页 - - - - - - - - - fetch mycur into vempno,vename,vjob; dbms_output.put_line(I Found You!|mycur%rowcount|行); dbms_output.put_line(读取的数据为 |vempno| |vename| |vjob); close mycur; end; 因为只读出来一条 , 所以要遍历一下 : declare cursor mycur is select empno,ename,job from emp; vempno emp.empno%type; ven

11、ame emp.ename%type; vjob emp.job%type; begin open mycur; loop fetch mycur into vempno,vename,vjob; exit when mycur%notfound; if mycur%found then dbms_output.put_line(读取的数据为 |vempno| |vename| |vjob); end if; end loop; dbms_output.put_line(I Found You!|mycur%rowcount|行); close mycur; end; 6: 通常情况下我们在读

12、取表数据的时候, 我们需要动态的去查询 . 所以能不能在Oracle 中给游标带参数呢 ?可以! 1): 如何定义带参数的游标 : declare cursor (参数名称 参数类型描述 ) is select xxxxx from bbbbb where aaa=? and ccc=?; 2): 例子: 游标是一个集合 , 读取数据有两种方式第一种方式 : open fetch close 第二种方式 : for 一但使用了 for 循环 在循环刚刚开始的时候 , 相当于执行open,在处理循环的时候 , 相当于执行 fetch, 在退出循环的时候 , 相当于执行了 close declar

13、e cursor query(vname varchar) is select empno,ename,job from emp where ename like%|vname|%; begin for line in query(A) loop dbms_output.put_line(line.empno| |line.ename| |line.job); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - end loop;

14、end; 实现动态输入 : declare cursor query(vname varchar) is select empno,ename,job from emp where ename like%|vname|%; name1 varchar(10); begin name1:=upper(&name1); for line in query(name1) loop dbms_output.put_line(line.empno| |line.ename| |line.job); end loop; end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁