游标
- 游标一次只能巡检一行数据
- 游标巡检的结果暂时存在游标中,但它一次只能读取一行数据,所以可以赋给与结果集同结构的变量
- 游标后面括号里面的数据类型不能指定长度
- 当游标后面声明变量后,可以在下面打开游标的时候对这个变量赋值
- 因为游标后面声明的变量是形参,所以如果下面赋值,以打开游标时的赋值为准
DECLARE
CURSOR CUR_A (a number:=100)IS SELECT * FROM EMP WHERE DEPTNO = 10;--声明游标
V_A EMP%ROWTYPE;--声明变量
BEGIN
OPEN CUR_A(20);--打开游标
--y
LOOP
FETCH CUR_A INTO V_A;--读取游标
EXIT WHEN CUR_A%NOTFOUND;--判断循环
DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB);
END LOOP;
CLOSE CUR_A;--关闭游标
END;
游标分类
-
静态游标
- 显示游标
- 隐式游标sql
-
动态游标
游标属性
一般用于控制程序流程
- %FOUND:判断是否从结果集中提取了数据。当游标中有可以提取的数据时返回True,没有的时候返回False。
- %ISOPEN:判断对应的游标变量是否打开,如果游标变量打开,则返回True;否则返回False。
- %NOTFOUND:当没有从游标中提取到数据时,返回True,否则返回False。
- %ROWCOUNT:用于返回到目前为止从游标中提取到的记录的行数。初始值是0,每提取一条数据%ROWCOUNT值会加1
EXIT WHEN CUR_A%NOTFOUND;
--判断当前行是否有数据 ,有则条件不成立,没有条件成立
显式游标使用过程
声明游标
关键字:CURSOR
declare
v_empno number:=&员工编号
cursor cu_name is select * from emp where empno=v_empno;--is后面跟着结果集
v_cu emp%rowtype--变量类型和数量与结果集的字段属性和数量y
--声明的时候结果集中出现的变量声明必须在游标之前
declare
cursor cu_name (v_empno number)is select * from emp where empno=v_empno;
--游标后面括号里面的数据类型不能指定长度
v_cu emp%rowtype
open cu_name(1001)--打开的时候可以给参数,运行的时候以给的参数为准
--实例:在一个begin中可以打开两次游标,使用不同的参数
DECLARE
CURSOR CUR_A (V_DEPTNO NUMBER)
IS SELECT * FROM EMP WHERE DEPTNO = V_DEPTNO;
V_A EMP%ROWTYPE;
BEGIN
OPEN CUR_A(10);--使用参数等于10打开游标
LOOP
FETCH CUR_A INTO V_A;
EXIT WHEN CUR_A%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
END LOOP;
CLOSE CUR_A ;
OPEN CUR_A(30);--使用30再次打开游标
LOOP
FETCH CUR_A INTO V_A;
EXIT WHEN CUR_A%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
END LOOP;
CLOSE CUR_A ;
END;
变量类型与结果集的结构类型一致
打开游标
OPEN CUR_A;
OPEN CUR_A(30);--声明时带有参数
打开游标的时候,游标指向第一行上面,直到遇到fetch向下走一行,才指向第一行
读取游标
关键字:fetch into
读取游标一般与循环搭配
FETCH cu_name INTO V_cu;
--往下走一行,取这一行的数据,赋给变量
--若取数的时候当前行没有数据,则不会进行取数,此时存储的仍然是上一行的数据,赋值时则把上一行的数据赋给变量
--v_cu 与cu_name的结构要求一致
LOOP
FETCH CUR_A INTO V_A;
EXIT WHEN CUR_A%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
END LOOP;
for循环读取游标不需要fetch
显式游标for循环
declare
cursor cur_a is select * from emp--声明游标
begin
for i in cur_a
loop
end loop;
end;
--隐式游标for循环
begin
for i in (select * from emp)
loop
end loop;
end
关闭游标
关键字close
CLOSE Cu_name;
隐式游标
关键字:sql
可以通过隐式游标的属性来了解操作的状态和结果,
进而控制程序的流程。
delete from emp where sal<3000;
--sql%rowcount
dbms_output.put_line(sql%rowcount)--返回上一条语句执行了多少次删除
动态游标
关键字:REF CURSOR
open 游标名 for 结果集
在一个语句块中,一个游标可以检索不同的结果集
在打开时面向结果集
声明
关键字:REF CURSOR
type <游标属性名> is REF CURSOR;
<游标名> <游标属性名>;
--实例:
type ref_v is ref cursor;
cur_a ref_v;
打开
关键字: open 游标名 for 结果集(结果集可以是字符串格式)
open cur_a for select * from emp;
完整过程
declare
type ref_a is ref cursor;
cur_a ref_a;
v_a varchar(20):='&输入条件';--注意输入条件
v_emp emp%rowtype;
v_sql varchar(100):='select * from emp where '||v_a;
begin
open cur_a for v_sql;--结果集可以是字符串格式查询语句变量
loop
fetch cur_a into v_emp;
exit when cur_a%notfound;
dbms_output.put_line(v_emp.ename);
end loop;
end;