一、游标
游标-----内存中的一块区域,存放的是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