Oracle基础语法汇总(八)

10天前 18.8k 0

Oracle基础语法汇总(八)-1点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!Oracle基础语法汇总(八)-2

既往文章链接(点击即可跳转):

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的声明部分定义查询,该查询可以返回多行

    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 游标是否打开

            示例:

              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;

                                  Oracle基础语法汇总(八)-3

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

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

                                  相关文章

                                  MySQL 9.0.0 新鲜出炉!支持向量类型
                                  OCP 4.x 特性解读:可观测性、高可用和易用性全面升级
                                  第 55 期:MySQL 频繁 Crash 怎么办?
                                  openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存
                                  Oracle 19C PDB迁移报错 ORA-17628: error 65338 returned by remote Oracle server
                                  【ORACLE】Oracle数据库并发控制、多版本控制、数据库独立性与应用性能优化

                                  发布评论