一、游标
游标-----内存中的一块区域,存放的是select 的结果。
游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。
二、游标类别
游标包括显式游标和隐式游标。
1、显式游标
显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。
在PL/SQL中处理显示游标所必需的四个步骤:
1)声明游标;CURSOR cursor_name IS select_statement
2)为查询打开游标;OPEN cursor_name
3)取得结果放入PL/SQL变量中;
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
4)关闭游标。CLOSE cursor_name
注意:在声明游标时,select_statement不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。
2、隐式游标
在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql。
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE
三、游标属性
Oracle 游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
%ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;
%FOUND %NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;
%ROWCOUNT返回当前位置为止游标读取的记录行数。
--游标声明 cursor cursor_name is select_statement ------------------------------------------------------------------------------------------- --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 declare cursor c_user is select * from tuser order by id asc; --定义一个游标变量v_row c_user%ROWTYPE ,该类型为游标c_user中的一行数据类型 c_row c_user%rowtype; begin for c_row in c_user loop dbms_output.put_line(c_row.id||' name '||c_row.name); end loop; end; ----------------------------------------------------------------------------------------------- --Fetch游标 --使用的时候必须要明确的打开和关闭 declare cursor c_user is select * from tuser order by id asc; c_row c_user%rowtype; begin open c_user; loop --提取一行数据到c_row fetch c_user into c_row; --判读是否提取到值,没取到值就退出 --取到值c_job%notfound 是false --取不到值c_job%notfound 是true exit when c_user%notfound; dbms_output.put_line(c_row.id||' name '||c_row.name); end loop; close c_user; end; -------------------------------------------------------------------------------------- --参数游标(for方式) declare cursor c_role(p_roleid varchar2) is select u.id id,u.name name,u.address address,r.roleid roleid,r.name rolename from tuser u,trole r where u.roleid=r.roleid and r.roleid=p_roleid; --必须定义别名 c_row c_role%rowtype; begin for c_row in c_role('1') loop dbms_output.put_line(c_role%rowcount||' '||c_row.id||' '||c_row.rolename); end loop; end; --------------------------------------------------------------------------------------- --参数游标(fetch方式) declare cursor c_role(p_roleid varchar2) is select u.id id,u.name name,u.address address,r.roleid roleid,r.name rolename from tuser u,trole r where u.roleid=r.roleid and r.roleid=p_roleid; --必须定义别名 c_row c_role%rowtype; begin open c_role('1'); loop fetch c_role into c_row; exit when c_role%notfound; dbms_output.put_line(c_role%rowcount||' '||c_row.id||' '||c_row.rolename); end loop; close c_role; end; ---------------------------------------------------------------------------------------- --更新操作 declare cursor c_user_update is select * from tuser for update of tuser.id; c_row c_user_update%rowtype; --定义一个变量,类型与表中指定字段的类型一致 c_name tuser.name%TYPE; begin for c_row in c_user_update loop if c_row.name='name' then c_name:=c_row.name||'---'; dbms_output.put_line(c_name); end if; update tuser set name=c_name where CURRENT OF c_user_update; end loop; end;
参考:http://www.2cto.com/database/201501/371435.html
http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html