点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!
既往文章链接(点击即可跳转):
Oracle基础语法汇总(一)
Oracle基础语法汇总(二)
Oracle基础语法汇总(三)
Oracle基础语法汇总(四)
Oracle基础语法汇总(五)
Oracle基础语法汇总(六)
oracle基础语法汇总(七)
五、游标管理
游标类型: 静态游标(隐式游标,显式游标),REF游标
REF游标用于处理运行时才能确定的动态SQL查询的结果
==========隐式游标==========
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为SQL
隐式游标的属性:
%found 只有DML语句影响一行或多行时,%found属性才返回true
返回值的类型为布尔型,值为TRUE代表插入 删除 更新或单行查询操作成功。
%notfound %notfound属性作用正好跟%found属性相反。如果DML语句没有影响任何行数 ,则%notfound属性返回true.返回值为布尔型,判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false,即与%FOUND属性返回值相反
%rowcount %rowcount属性返回DML语句影响的行数。如果DML语句没有影响任何行数 ,则%rowcount属性将返回0。返回值类型为整型,返回当前位置为止游标读取的记录行数,即成功执行的数据行数
%isopen %isopen属性判断SQL游标是否已经打开。在执行SQL语句之后,oracle自动关闭SQL 游标,所以隐式游标的%isopen属性始终为false.
返回的类型为布尔型,判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false,即执行过程中为真,结束后为假。
示例:
begin
update user_tbl set score=score+5;
if SQL%found then
dbms_output.put_line('数据被更改:'||SQL%rowcount);
elsif sql%notfound then
dbms_output.put_line('没有找到数据!');
end if;
if SQL%isopen then
dbms_output.put_line('Open');
else
dbms_output.put_line('Close');
end if;
end;
==========显式游标==========
在PL/SQL的声明部分定义查询,该查询可以返回多行
-
声明游标:使用CURSOR关键字来声明一个游标变量。
-
打开游标:使用OPEN语句来执行游标关联的查询,并加载数据。
-
使用游标:使用FETCH语句来提取游标指向的行。
- 关闭游标:使用CLOSE语句来释放游标占用的资源。
声明游标完成两个任务:
给游标命名
将一个查询与游标关联
cursor cursor_name is select statement;
打开游标:
open cursor_name;
使用游标:
fetch cursor_name into record_list;
关闭游标:
close cursor_name;
显式游标的属性:
%found 执行最后一条fetch语句成功返回行时为true
%notfound 执行最后一条fetch语句未能返回行时为true
%rowcount 返回到目前为止游标提取的行数
%isopen 游标是否打开
示例:
declare
users user_tbl%rowtype;
cursor boys_cur is select * from user_tbl where sex='h';
begin
open boys_cur;
loop
fetch boys_cur into users;
exit when boys_cur%notfound;
dbms_output.put_line(users.user_name||' '||users.password);
dbms_output.put_line(boys_cur%rowcount);
end loop;
close boys_cur;
end;
带参的显式游标
declare
users user_tbl%rowtype;
cursor boys_cur(sexParam varchar2)
is select * from user_tbl where sex=sexParam;
begin
open boys_cur('&sex');
loop
fetch boys_cur into users;
exit when boys_cur%notfound;
dbms_output.put_line(users.user_name||' '||users.password);
dbms_output.put_line(boys_cur%rowcount);
end loop;
close boys_cur;
end;
使用显式游标更新行
declare
cursor user_update_cur is select sex from user_tbl for update;
usersex user_tbl.sex%type;
begin
open user_update_cur;
loop
fetch user_update_cur into usersex;
exit when user_update_cur%notfound;
dbms_output.put_line(usersex);
if usersex = 'M' then
update user_tbl set score=score-5 where current of user_update_cur;
else
update user_tbl set score=score+5 where current of user_update_cur;
end if;
end loop;
close user_update_cur;
commit;
end;
循环游标
declare
cursor user_cur is select * from user_tbl;
begin
for username in user_cur loop
dbms_output.put_line(username.user_name||' '||username.sex);
end loop;
end;
==========REF游标==========
REF游标和游标变量用于处理运行时动态执行的SQL查询
创建游标变量的步骤:
J 声明REF游标类型
J 声明REF游标类型的变量
声明类型的语法
Type ref_cursor_name is ref cursor [return return_type];
打开游标变量的语法
Open cursor_name for select_statement;
----声明强类型的游标
declare
type ref_cur is ref cursor return user_tbl%rowtype;
users_cur ref_cur;
----声明弱类型的游标
declare
type ref_cur is ref cursor;
users_cur ref_cur;
示例
----强类型
declare
type ref_cur is ref cursor return user_tbl%rowtype;
users_cur ref_cur;
users user_tbl%rowtype;
begin
open users_cur for select * from user_tbl where user_name='ny2t92';
loop
fetch users_cur into users;
exit when users_cur%notfound;
dbms_output.put_line(users.user_Name);
end loop;
close users_cur;
end;
----弱类型
declare
type ref_cur is ref cursor;
my_cur ref_cur;
users user_tbl%rowtype;
stus stu_tbl%rowtype;
begin
open my_cur for select * from user_tbl;
loop
fetch my_cur into users;
exit when my_cur%notfound;
dbms_output.put_line(users.user_Name);
end loop;
close my_cur;
open my_cur for select * from user_tbl where user_name='ny2t92';
loop
fetch my_cur into users;
exit when my_cur%notfound;
dbms_output.put_line(users.user_Name);
end loop;
close my_cur;
open my_cur for select * from stu_tbl;
loop
fetch my_cur into stus;
exit when my_cur%notfound;
dbms_output.put_line(stus.stu_Name);
end loop;
close my_cur;
end;
----动态SQL游标
declare
type ref_cur is ref cursor;
my_cur ref_cur;
users user_tbl%rowtype;
username varchar2(20);
sqlstmt varchar2(200);
begin
username:='&username';
sqlstmt := 'select * from user_tbl where user_name= :name';
open my_cur for sqlstmt using username;
loop
fetch my_cur into users;
exit when my_cur%notfound;
dbms_output.put_line(users.user_Name);
end loop;
close my_cur;
end;
点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。
动动小手点击加关注呦☟☟☟