游标
来源:互联网 发布:液压系统计算软件 编辑:程序博客网 时间:2024/05/01 08:58
学一样技术,应该知道一下三个方面的知识,就是它是什么?有什么用途?怎么用?其中怎么用是非常重要的。
一、 游标是什么?
游标(cursor)可以被看作指向结果集(a set of rows)中一行的指针(pointer)游标可以被看作指向结果集中一行指针。结果集又是什么呢?比如select查询语句返回的就是一个集合。
二、 游标有几种类型?
分为显示或隐式游标,隐式游标是oracle中自带的游标,显示游标是需要自己定义的游标。
1、隐式游标:在执行sql语句时,自动创建的一个隐式游标,这个游标是内存中处理该语句的工作区间,其中存储了执行sql语句后的结果,通过游标可获得sql语句执行的结果已经游标状态信息
游标的主要属性如下:
%FOUND 布尔属性:如果sql语句至少影响一行 则为true 否则为false
%NOTFOUND 布尔属性:与%FOUND相反
%ISOPEN :布尔属性,游标打开返回true,否则返回false
%ROWCOUNT:数组属性 返回受sql语句(insert 、update 、delete)影响的行数
使用游标前,应先设置输出服务为打开的状态
SQL> set serveroutput on;
使用隐式游标
SQL> begin
2 update emp set sal=2000 where empno=7369; //修改的sql语句
3 if sql%found then//隐式的游标使用是sql%......
4 dbms_output.put_line('更新了'||sql%rowcount||'行,成功');
5 else
6 dbms_output.put_line('更新失败');
7 end if;
8 end;
9 /
更新了1行,成功
PL/SQL procedure successfully completed
另一种隐式游标
自动往下走,循环输出检索出来的结果
SQL> begin
2 for res in (select ename from emp)//res是不用定义的
3 loop
4 dbms_output.put_line(res.ename);
5 end loop;
6 end;
7 /
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
guo
PL/SQL procedure successfully completed
二、显示游标
声明游标
Cursor cursor_name[parameter[,parameter]…]
[return return_type] is select_statement;
Parameter作为游标的输入参数,可以让用户打开游标,向游标中传递值
根据员工的编号查询员工的信息
declare
cursor emp_cursor (pno in number(4) default 7369)
is select * from emp where empno=pno;
emp_row emp%rowtype;
begin
open emp_cursor(7934);
fetch emp_cursor into emp_row;
dbms_output.put_line(emp_row.ename);
close emp_cursor;
end;
/
打开游标:执行声明游标是指定的查询语句。用open打开
Open cursor_name(参数)
如果没有指定参数,就采用默认值执行sql语句
检索数据:从检索到的结果集中获取数据,存到变量中,以便变量的处理
使用fetch语句找出结果集中的单行,并从中提取值存到主变量中
语法:(待会。。。。。)
Declare
Cursor emp_cursor (pno in number(4) default 7369) is select * from emp where empno=pon;
Emp_row emp%rowtype;
Begin
Open emp_cursor;
Fetch emp_cursor into emp_row;
Dbms_output.put_line(emp_row.ename);
Close emp_cursor;
End;
/
游标的for循环
依次读取结果集中的行,当for循环开始时,游标会自动打开(不需要用open方法开启),每循环读取一次,系统自动调用fetch,结束时自动关闭(调用close)
游标变量
游标变量可以出来多行查询结果集
游标变量的定义包括两个步骤
1. 定义cursor类型的指针
语法:
Type ref_cursor_name is ref cursor[return return_type]
2. 定义refcursor类型的变量
V_rc var_cursor_name;
上面称为弱的ref cursor类型,因为没有声明游标的返回结果,可以指向任何的select查询才结果集
强的ref cursor类型
语法:
Type varcursorName is cursor return emp%rowtype
……
使用游标变量与游标使用方式一样,也需要声明、打开、检索
例如:
Declare
Cursor emp_cursor(pno in number default 7369) is select * from emp where empno=pno;
Type emp_cname id ref cursor return emp%rowtype;
Ecname emp_cname;
Begin
Open ecname for select * from emp where empno=7934;
Loop
Fetch ecnam into emp_row;
Exit when ecname%notfound;
Dbms_output.put_line(emp_row.ename);
End loop;
End;
/
Shift+esc是强制退出PL/SQL的命令窗口
使用游标更新数据库
1. 定位游标,指定修改、删除的数据行 更新的时候用到for update选项
语法如下:
Cursor cursor_name is select_statement;
For update[of column[,column],[nowait]]
Of来指定用来指定锁定的列,如果忽略of将锁定所有的列,如果指定的列已经被锁了,必须解锁后才能锁定,这时候用到了nowait
。。。。。。。。
例如:
Declare
Cursor ecname is select * from emp where empno=7934 for update of sal nowait;
Esal number(7,2);
Begin
Dbms_output.put_line(‘开始’);
For r in ecname
Loop
Esal:=r.sal+10;
Update emp set sal=esale where empno=7934;
End loop;
Close ecname;
Dbms_output.put_line(‘结束’);
End;