Oracle基础语法汇总(八)

科技   2024-06-21 09:00   河南  

点击蓝色字关注“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,即执行过程中为真,结束后为假。


示例:

beginupdate user_tbl set score=score+5;if SQL%found thendbms_output.put_line('数据被更改:'||SQL%rowcount);elsif sql%notfound thendbms_output.put_line('没有找到数据!');end if;if SQL%isopen thendbms_output.put_line('Open');elsedbms_output.put_line('Close');end if;end;
==========显式游标==========
在PL/SQL的声明部分定义查询,该查询可以返回多行
  1. 声明游标:使用CURSOR关键字来声明一个游标变量。

  2. 打开游标:使用OPEN语句来执行游标关联的查询,并加载数据。

  3. 使用游标:使用FETCH语句来提取游标指向的行。

  4. 关闭游标:使用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 游标是否打开

示例:
declareusers user_tbl%rowtype;cursor boys_cur is select * from user_tbl where sex='h';beginopen boys_cur;loopfetch 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;
带参的显式游标
declareusers user_tbl%rowtype;cursor boys_cur(sexParam varchar2)is select * from user_tbl where sex=sexParam;beginopen boys_cur('&sex');loopfetch 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;
使用显式游标更新行
declarecursor user_update_cur is select sex from user_tbl for update;usersex user_tbl.sex%type;beginopen user_update_cur;loopfetch user_update_cur into usersex;exit when user_update_cur%notfound;dbms_output.put_line(usersex);if usersex = 'M' thenupdate user_tbl set score=score-5 where current of user_update_cur;elseupdate user_tbl set score=score+5 where current of user_update_cur;end if;end loop;close user_update_cur;commit;end;
循环游标
declarecursor user_cur is select * from user_tbl;beginfor username in user_cur loopdbms_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;
----声明强类型的游标
declaretype ref_cur is ref cursor return user_tbl%rowtype;users_cur ref_cur;
----声明弱类型的游标
declaretype ref_cur is ref cursor;users_cur ref_cur;
示例
----强类型

declaretype ref_cur is ref cursor return user_tbl%rowtype;users_cur ref_cur;users user_tbl%rowtype;beginopen users_cur for select * from user_tbl where user_name='ny2t92';loopfetch users_cur into users;exit when users_cur%notfound;dbms_output.put_line(users.user_Name);end loop;close users_cur;end;
----弱类型
declaretype ref_cur is ref cursor;my_cur ref_cur;users user_tbl%rowtype;stus stu_tbl%rowtype;beginopen my_cur for select * from user_tbl;loopfetch 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';loopfetch 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;loopfetch my_cur into stus;exit when my_cur%notfound;dbms_output.put_line(stus.stu_Name);end loop;close my_cur;end;
----动态SQL游标
declaretype ref_cur is ref cursor;my_cur ref_cur;users user_tbl%rowtype;username varchar2(20);sqlstmt varchar2(200);beginusername:='&username';sqlstmt := 'select * from user_tbl where user_name= :name';open my_cur for sqlstmt using username;loopfetch my_cur into users;exit when my_cur%notfound;dbms_output.put_line(users.user_Name);end loop;close my_cur;end;

点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。


动动小手点击加关注呦☟☟☟

SQL数据库运维
专注于SQL数据库相关领域,Oracle、MySQL、SQL Server、PostgreSQL、大数据,数据分析等相关技术内容的分享,关注回复「SQL」可免费获取海量学习资料,包含文档、视频及部分常用软件安装包和日常小工具等资源。
 最新文章