一.PL/SQL 语句中的游标:
个人理解:游标是一种临时性的数据库文件。
可以试想有多条数据,而游标可以直接从多条数据中直接提取出现相应的某一条数据,类似于学过的C中的指针中的内容,通过获取存放定向的得到需要的数据,不过差别在于游标是处理查询结果集中的数据。
游标类型有:隐式游标、显式游标和 REF 游标
隐式游标由 PL/SQL 自动定义、打开和关闭
显式游标用于处理返回多行的查询(一般来说默认的都是显示游标)
**********************************************
二.游标使用——
(1)游标(curson)的声明
declare Curson curson_name is[(parameter[, parameter]…)] [RETURN datatype] select culumn(想要查询的数据信息内容)Ps:1.游标参数只能为输入参数
2.在指定数据类型时,不能使用长度约束
3.[RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与 select 中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。
4.此处的select语句同对应的相应的select中的查询语句的功能一样,游标同样适用,且不仅仅针对于相应的视图和表数据,还可以同多个表和多个列多个视图的数据进行查询,因为追中返回的是一个**结果集**
**************************************************
(2) 游标的打开可以理解为:就是对上面执行游标所对应的 SELECT 语句,将其查询结果放入工作区,并且指 针指向工作区的首部,标识游标结果集合的过程执行语句如下:
open curson_name //此处的curson_name需要和上面我们(1)中的声明的curson_name名字保持一致*******************************************************
(3)游标的提取过程:主要实现的就是将检索结果集合中的数据行,并放入指定的输出变量中,以此同时,游标中的数据每次执行一个fetch语句,提取一次数据时候,都对应的指向游标所要指向的下一行数据
执行语句如下:
FETCH cursor_name INTO {variable_list | record_variable };注:
特别的当检索到最后一行数据时,如果再次执行 FETCH 语句,将操作失败,并会默认的将游标属性 %NOTFOUND 置为 TRUE。
所以每次执行完 FETCH 语句后,检查游标属性%NOTFOUND,就可以判断 FETCH 语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋值。
(4)关闭游标:当提取和处理完游标结果集合数据后,通过关闭游标的形式来释放该游标所占用的资源
执行语句如下:
close curson_name;
注:
(1)关闭游标意味着无法再通过fetch语句来从数据库中对信息进行获取放入,如果需要再次执行仍需要要open curson (打开游标)来实现
(2)游标如果不经过声明一般默认的都是显式游标
***************************************************
三.使用游标注意事项游标属性和 属性作用: (1)Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作 FETCH成功则为 TRUE,否则为 FALSE; (2)Cursor_name%NOTFOUND 布尔型属性,与%FOUND 相反; (3)Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE; (4)Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
*****************************************************
四.游标的使用
(1)标准型的游标的使用
DECLARE CURSOR emt_cursor IS SELECT pl_id,last_name ,elements.element_name FROM pl,elements WHERE pl.element_id = elements.element_id AND pl.element_id = 90 FOR UPDATE OF salary NOWAIT ; BEGIN FOR emt_data IN emt_cursor LOOP UPDATE pl p SET p.salary = 29999 where p.pl_id = emt_data.pl_id WHERE CURRENT OF emt_cursor; END LOOP; END; declare cursor emp_cursor1 is select ename,sal from emp where sal < 1000; v_name emp.ename%type; v_sal emp.sal%type; begin open emp_cursor1; loop fetch emp_cursor1 into v_name,v_sal; exit when emp_cursor1%notfound; dbms_output.put_line(v_name || '---' || v_sal); --dbms_output.put_line('isOpen:'||emp_cursor1%isopen); --查看游标状态 end loop; close emp_cursor1; end;(2)传参形游标
declare cursor emp_cursor2(cursor_sal number default 2000) is --(此处的参数是默认参数,后面可以重新设置,此默认值失效) select ename,sal from emp where sal >= cursor_sal; v_name emp.ename%type; v_sal emp.sal%type; begin open emp_cursor2(cursor_sal=>3000); --(重新设置参数值) loop fetch emp_cursor2 into v_name,v_sal; exit when emp_cursor2%notfound; dbms_output.put_line(v_name || '---' || v_sal); end loop; dbms_output.put_line('rowcount:'||emp_cursor2%rowcount); --(游标记录数) close emp_cursor2; end;****************************************************
五.隐式游标
(1)隐式游标主要针对的是那些非查询语句,如修改、删除操作等,隐式游标的名字为 SQL,这是由 ORACLE 系统定义的。
注:隐式游标同显式游标很大程度的不同在于,定义(declare)打开(open)关闭(close)的操作都是系统默认自动执行的部分,而不是在需要用户进行相应的操作。
(2)使用方式:SQL%
(3)隐式游标的属性设置:
SQL%FOUND TRUE 有结果 成功 成功
SQL%FOUND FALSE 没结果 失败 失败
SQL%NOTFUOND TRUE 没结果 失败 失败
SQL%NOTFOUND FALSE 有结果 成功 失败
SQL%ROWCOUNT 返回行数,只为 1插入的行数 修改的行数 删除的行数
DECLARE nan_rows NUMBER; BEGIN --更新数据 UPDATE monet SET sallery = 30000 WHERE nid = 20; //获取默认游标的属性值 nan_rows := SQL%ROWCOUNT; dbms_output.put_line('更新了'||nan_rows||'个员工的工资'); END;