我的编程空间,编程开发者的网络收藏夹
学习永远不晚

session cursor 的种类和用法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

session cursor 的种类和用法

oracle 中的session cursor分为三种:显式游标(explicit cursor) 隐式游标(implicit cursor) 参考游标(ref cursor)

一、 隐式游标(implicit cursor)

   无处不在,oracle中最常见的游标,只要执行一个SQL或者pl/sql,Oracle就会自动创建一个隐式游标,它的生命周期(open,bind,parse,execute,fetch,close)由SQL引擎或者pl/sql引擎自动控制,所有也意味着我们失去了对隐式游标的控制权。

  不过还是可以通过隐式游标的下列几个属性来了解与之相关的sql信息

SQL%FOUND

SQL%NOTFOUND

SQL%ISOPEN

SQL%ROWCOUNT

1、 SQL%FOUND表示一条语句被执行后,受其影响而改变的记录数是否大于等于1,故通常适用于DML语句,或者select into. SQL执行前这个值为null,成功改变记录数后变为true,否则为false

declare

   empno_no number(4) :=7934;

  begin

 delete from emp where empno=empno_no;

   if sql%found then

  insert into emp(empno,ename,mgr) values(8000,'JACK',7902);

  end if;

  commit;

 end;

  /

这个例子即利用 SQL%FOUND,当删除一条记录后,才插入一条记录

特别注意select into的情况,仅当返回结果只有一条记录,Oracle才不会报错,如果返回结果0,则报错no data found,如果返回结果大于1条,则报错too many rows

declare

      emp1 varchar2(14);

     vc_message varchar2(4000);

    begin

     select empno into emp1 from emp where empno = 7900;

    exception

    when no_data_found then

    dbms_output.put_line('no data found!');

    return;

    when too_many_rows then

   dbms_output.put_line('too many rows!');

   return;

  when  others then

  vc_message := 'E'||'_'||sqlcode||'_'||sqlerrm;

     dbms_output.put_line(vc_message);

 return;end;

2、SQL%NOTFOUND

与 SQL%FOUND 相反,受其影响而改变的记录数是否为0,故通常适用于DML语句,或者select into. SQL执行前这个值为null,没有改变记录数为true,改变了就是false

3、SQL%ISOPEN

隐式游标中,这个值永远为false 

4、SQL%ROWCOUNT

SQL%FOUND表示一条语句被执行后,受其影响而改变的记录数,与SQL%FOUND SQL%NOTFOUND一样,这个值适用于update,delete,insert 等DML操作和select into,注意在select into中,返回值多于1时,Oracle会报错 ,这是这个值返回的是1,而不是select了多少条记录。当前 SQL%ROWCOUNT只代表上一个被执行的sql,如果有新的SQL执行,这个值会被覆盖,所以如果需要用到某条SQL执行后产生的这个值,可以在执行完后将该值放入一个变量中

二、显式游标(explicit cursor)

用于pl/sql的代码中(比如package,函数,存储过程),其生命周期中的open,fetch,close可以由我们在代码中显示控制,显式游标的四个常见属性 CURSORNAME%FOUND,CURSORNAME%NOTFOUND,CURSORNAME$ISOPEN,CURSORNAME%ROWCOUNT

1、CURSORNAME%FOUND

指定的显式游标(即cursorname的游标名字)是否有一条记录被fetch,当一个游标被open,还没有fetch,该值为null,fetch后该值为true,fetch 完所有记录后该值还是为true,这时再fetch一次,Oracle不会报错,而是该值变为false。如果该游标还没有被open就试图使用这个值,则会报invalid_cursor

 declare

    cursor c1 is select ename,sal from emp where rownum<10;

    my_name emp.ename%type;

    my_sal emp.sal%type;

  begin 

     open c1;

       loop

         fetch c1 into my_name,my_sal;

         if c1%found then 

           dbms_output.put_line('name='||my_name||',salary='||my_sal);      

         else

          exit;

         end if;

       end loop;

      close c1;

   end;

2、 CURSORNAME$ISOPEN

指定的游标是否被open ,通常用于标准的exception处理流程,用于 close那些由于exception而导致显示游标open了却没有被正常关闭的时候

exception 

   when others then 

    if c1%isopen=ture then 

      close c1;

   end if;

   return;

end;

3、 CURSORNAME%NOTFOUND

与1相反, 指定的显式游标(即cursorname的游标名字)是否有一条记录被fetch,当一个游标被open,还没有fetch,该值为null,fetch后该值为false,fetch 完所有记录后该值还是为false,这时再fetch一次,Oracle不会报错,而是该值变为true。如果该游标还没有被open就试图使用这个值,则会报invalid_cursor

declare

    cursor c1 is select ename,sal from emp where rownum<10;

    my_name emp.ename%type;

    my_sal emp.sal%type;

  begin 

     open c1;

       loop

         fetch c1 into my_name,my_sal;

         if c1%notfound then 

             exit;

          else

           dbms_output.put_line('name='||my_name||',salary='||my_sal);  

         end if;

       end loop;

      close c1;

   end;

4、 CURSORNAME%ROWCOUNT  表示该游标一共被fetch了多少行记录

   declare

    cursor c1 is select ename from emp where rownum<10;

    my_name emp.ename%type;

   begin

     open c1;

      loop

        fetch c1 into my_name;

        if c1%found then

          dbms_output.put_line(c1%rowcount||':='||my_name );

       else

          exit;

       end if ;

      end loop;

     close c1;

 end;

对显示游标四个属性的总结

1、当一个显示游标没有被open时,使用cursorname%found,cursorname%notfound,cursorname%rowcount,oracle会报错invalid_cursor

2、首次fetch时结果集返回一个空值,则cursorname%found 为false ,cursorname%notfound 为true,cursorname%rowcount 为0

最后看一个显式游标在pl/sql中的标准用法

create or replace procedure p_demo_explicit_cursor_std

  2  is

  3  cursor c1 is select * from emp where rownum<10;

  4  emp_rec emp%rowtype;

  5  begin

  6  open c1;

  7  fetch c1 into emp_rec;

  8  while (c1%found) loop

  9   dbms_output.put_line('name='||emp_rec.ename||',salary='||emp_rec.sal);

 10  fetch c1 into emp_rec;

 11  end loop;

 12  close c1;

 13  exception

 14   when others then 

 15     --o_parm:='E'||sqlcode||sqlerrm;

 16     rollback;

 17     --写日志

 18     RETURN;

 19  end p_demo_explicit_cursor_std;

注意以下两点

显示游标的标准用法,先open再fetch,然后一个while循环逐条处理数据,最后close

在while内部循环处理完一条记录后,一定要执行fetch以跳到下一条记录,不然会死循环

三、参考游标(ref_cursor)

和显式游标一样,参考游标也是用于pl/sql的代码中(比如package,函数,存储过程),其生命周期中的open,fetch,close可以由我们在代码中显示控制,参考游标的四个常见属性 CURSORNAME%FOUND,CURSORNAME%NOTFOUND,CURSORNAME$ISOPEN,CURSORNAME%ROWCOUNT,属性也是跟显式游标一样

参考游标是这三种游标中灵活性最好的一种游标,主要体现在以下几点

1、定义方式灵活,可以有多种定义方式

第一种方式

type typ_cur_emp is ref cursor return emp%rowtype;

cur_emp typ_cur_emp;

第二种方式

type typ_result is record(ename emp.ename%type,sal emp.sal%type);

type typ_cur_strong is ref cursor return typ_result;

cur_emp typ_cur_stong;

第三种方式

type typ_cur_weak is ref cursor;

cur_emp typ_cur_weak;

第四种方式

cur_emp sys_refcursor;

2、open方式灵活,不跟具体SQL绑定,可以随时open,每次open可以对应不同的sql

declare

 type typ_cur_emp is ref cursor return emp%rowtype;

 cur_emp typ_cur_emp;

 procedure process_emp_cv(emp_cv in typ_cur_emp) is

   person emp%rowtype;

 begin

   dbms_output.put_line('----');

   loop

     fetch emp_cv into person;

     exit when emp_cv%notfound;

     dbms_output.put_line('name='||person.ename);

   end loop;

 end;

 begin

   open cur_emp for select * from emp where rownum<11;

   process_emp_cv(cur_emp);

   close cur_emp;

   

   open cur_emp for select * from emp where ename like 'C%';

   process_emp_cv(cur_emp);

   close cur_emp;

  end;

3、参考游标可以做为存储过程的输入参数和函数的输出参数

4、参考游标的额外用法

除了一次fetch一条记录,还可以一次性fetch多条记录

可以和显示游标嵌套使用

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

session cursor 的种类和用法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle中cursor的用法有哪些

在Oracle中,游标(cursor)是一种数据库对象,用于处理查询结果集。以下是Oracle中使用游标的一些常见用法:1. 隐式游标:当执行一个查询语句时,Oracle会自动创建一个隐式游标来处理查询结果集。您可以使用FETCH语句获取隐
2023-08-08

web集群时session同步的3种方法

在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种
2023-01-31

php中session的用法

session 是服务器端存储机制,用于在用户访问期间存储和检索用户信息,包括页面访问、购物车内容和登录状态。其使用方法包括:启动 session、设置 session 变量、检索 session 变量、销毁 session 以及配置 se
php中session的用法
2024-05-15

云服务器的用法有哪些种类和特点

云服务器(CloudServer)是一种虚拟服务器,可以在互联网上提供云存储、计算、负载均衡和网络加速服务。云服务器的使用可以按照用法和特点进行分类,具体包括以下几种:使用场景:云服务器主要用于在线教育、游戏、医疗等行业,提供快速、稳定、高性能的服务。同时,云服务器可以用于云计算和云存储,满足用户对高可用性和数据安全性的需求。使用类型:云服务器可以按照应用场景、使用类型和技术特点来分类,例
2023-10-26

Spring MVC 中获取session的几种方法(小结)

Spring MVC 中使用session是一种常见的操作,但是大家上网搜索一下可以看到获取session的方式方法五花八门,最近,自己终结了一下,将获取session的方法记录下来,以便大家共同学习进步。第一种:将HttpSession作
2023-05-31

PHP Session的使用方法

本篇内容介绍了“PHP Session的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP Session使用php3本身是没有实
2023-06-17

koa2实现session的两种方式(基于Redis 和MySQL)

一.基于MySQL的实现方式这种方式需要安装koa-session-minimal和koa-mysql-session两个依赖。执行npm install koa-session-minimal koa-mysql-session项目配置:const sess
koa2实现session的两种方式(基于Redis 和MySQL)
2014-08-19

云服务器的用法有哪些种类和特点呢

云服务器是一种虚拟化软件,用于管理和分配云资源。它通常包括两个部分:一个是托管云,即云服务器的管理平台,负责管理、分配、监控云服务器上的资源。另一个是私有云,即在企业内部部署的云服务器,用户可以通过访问私有云来管理、使用和共享资源。云服务器主要有以下用法:租赁:云服务器的使用者可以租用云服务器,以获得更高的可用性和灵活性。这可以是个人用户,企业用户或大型企业,可以在自身的内部或外部环境中使用云服务器。租赁的优...
2023-10-27

Python中处理Session和Cookie的方法

这篇文章主要介绍了Python中处理Session和Cookie的方法,本文介绍了Python中如何处理Session和Cookie,包括获取、设置、删除和使用Session和Cookie的相关方法和技巧,主要涉及Python的requests、http.cookiejar和Flask等库和框架
2023-05-18

SQL中cursor的基本使用方法是什么

这篇文章主要介绍“SQL中cursor的基本使用方法是什么”,在日常操作中,相信很多人在SQL中cursor的基本使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL中cursor的基本使用方法
2023-06-25

编程热搜

目录