1 什么是游标
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
2 游标有什么作用
①指定结果集中特定行的位置。
②基于当前的结果集位置检索一行或连续的几行。
③在结果集的当前位置修改行中的数据。
④对其他用户所做的数据更改定义不同的敏感性级别。
⑤可以以编程的方式访问数据库。
3 游标类型
逐行处理查询结果,以编程的方式访问数据
游标的类型
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE
3.1 隐式游标 %FOUND
DECLARE BEGIN insert into book (book_id,book_name) values('445561','java继承'); if SQL%found then Dbm('found为true'); else Dbm('found为false'); end if; commit; END;3.2 隐式游标 %FOUND
DECLARE BEGIN update book set book_name = 'java继承' where book_id='4455011'; if SQL%found then Dbm('found为true'); else Dbm('found为false'); end if; commit; END;3.3 隐式游标 %NOTFOUND
DECLARE BEGIN insert into book (book_id,book_name) values('445561','java继承'); if SQL%notfound then Dbm('notfound为true'); else Dbm('notfound为false'); end if; commit; END;3.4 隐式游标 %NOTFOUND
DECLARE BEGIN update book set book_name = 'java继承' where book_id='4455011'; if SQL%notfound then Dbm('notfound为true'); else Dbm('notfound为false'); end if; commit; END;3.5 隐式游标 %ROWCOUNT
DECLARE BEGIN insert into book (book_id,book_name) values('445561','java继承'); Dbm('游标影响的行数'||SQL%rowcount); commit; END;3.6 隐式游标 %ROWCOUNT
DECLARE BEGIN insert into book (book_id,book_name) values('445561','java继承'); Dbm('游标影响的行数'||SQL%rowcount); commit; END;3.7 隐式游标 %ROWCOUNT
DECLARE BEGIN update book set book_name = 'java继承' where book_id='4455011'; Dbm('游标影响的行数'||SQL%rowcount); commit; END;3.8 隐式游标 %ISOPEN
DECLARE BEGIN insert into book (book_id,book_name) values('445561','java继承'); if SQL%isopen then Dbm('isopen为true'); else Dbm('isopen为false'); end if; commit; END;3.9 隐式游标 %ISOPEN
DECLARE BEGIN update book set book_name = 'java继承' where book_id='4455011'; if SQL%isopen then Dbm('isopen为true'); else Dbm('isopen为false'); end if; commit; END;4 显示游标
显式游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行
显式游标的操作过程
4.1 声明显示游标
CURSOR <cursor_name> IS SELECT statement FOR UPDATE;4.2 使用LOOP从游标中提取所有记录
SQL>SET SERVER OUTPUT ON SQL>DECLARE my_toy_price toys.toyprice%TYPE; CURSOR toy_cur IS SELECT toyprice FROM toys WHERE toyprice<250; BEGIN OPEN toy_cur; LOOP FETCH toy_cur INTO my_toy_price; EXIT WHEN toy_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('TOYPRICE=:玩具单价=:'||my_toy_price); END LOOP; CLOSE toy_cur; END;4.3 使用LOOP从游标中提取所有记录
SQL> SET SERVEROUTPUT ON SQL> DECLARE desig VARCHAR2(20); emp_code VARCHAR2(5); empnm VARCHAR2(20); CURSOR emp_cur(desigparam VARCHAR2) IS SELECT empno, ename FROM employee WHERE designation=desig; BEGIN desig:= '&desig'; OPEN emp_cur(desig); LOOP FETCH emp_cur INTO emp_code,empnm; EXIT WHEN emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(emp_code||' '||empnm); END LOOP; CLOSE emp_cur; END;4.4 循环游标用于简化游标处理代码
当用户需要从游标中提取所有记录时使用
循环游标的语法如下:
FOR <record_index> IN <cursor_name> LOOP <executable statements> END LOOP; 示例 SQL> SET SERVER OUTPUT ON SQL> DECLARE CURSOR mytoy_cur IS SELECT toyid, toyname, toyprice FROM toys; BEGIN FOR toy_rec IN mytoy_cur LOOP DBMS_OUTPUT.PUT_LINE( ‘玩具编号:'||' ' ||' ' ||‘玩具名称:'||' '||' ' ||‘玩具单价:'||' '); END LOOP; END;4.5 案例
----定义游标 declare userinfo user_info%rowtype; cursor user_cursor is select * from user_info; begin ---打开游标 OPEN user_cursor; loop FETCH user_cursor into userinfo; exit when user_cursor%NOTFOUND; Dbm('编号:' ||' 姓名:'||' 年龄:'); end loop; CLOSE user_cursor;--关闭游标 end; select * from user_info; --------带参数游标 declare userinfo user_info%rowtype; userId number; --定义带参数的游标 cursor user_cur(uid number) is select * from user_info where user_id=uid; begin userId :=&userid; OPEN user_cur(userId);---打开 loop FETCH user_cur into userinfo; exit when user_cur%NOTFOUND; Dbm('编号:' ||' 姓名:'||' 性别:'); end loop; CLOSE user_cur;--关闭游标 end ; -----使用for in提取游标中记录 declare userinfo user_info%rowtype;--一行的记录类型 cursor user_cursor is --游标 select * from user_info; begin --自动打开游标 自动关闭游标 for userinfo in user_cursor LOOP Dbm('编号:' ||' 姓名:'||' 性别:'); end loop; end;5 REF游标
REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
创建游标变量需要两个步骤:
声明 REF 游标类型
声明 REF 游标类型的变量
用于声明 REF 游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR [RETURN <return_type>];打开游标变量的语法如下:
OPEN cursor_name FOR select_statement;
声明强类型的 REF 游标
声明弱类型的 REF 游标