《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 页 - - - - - - - - -