《转》数据库-游标

作者: 奇哥威武 | 来源:发表于2017-02-24 15:28 被阅读26次

       一,游标是什么?

                     游标是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响到的数据。通俗理解就是将受影响的数据暂时放到了一个内存区域的虚表中,而这个虚表就是游标。

            二,作用是什么?

                      1,大家都知道数据库中的事物可以回滚,而游标在其中起着非常重要的作用,由于对数据库的操作我们会暂时放在游标中,只要不提交,我们就可以根据游标中内容进行回滚,在一定意义有利于数据库的安全。

                     2,另外,在Oracle中PL/SQL只能返回单行数据,而游标弥补了这个不足。相当于ADO.NET中的Data table吧。

             三,类型:

                    1,隐式游标:增删改等操作Oracle都会自动创建游标,暂时保存操作结果,也就是能够回滚的操作都会引发游标的创建。

                    2,显示游标:由开发人员通过程序显式控制,用于从表中取出多行数据,并将多行数据一行一行的单独进行处理.

     

             四,属性:

    属性

    注释

    %rowcount 

     受SQL影响的行数

    %found

     Boolean值,是否还有数据

    %notfound

    Boolean值,是否已无数据

    %isopen

    游标是否打开

     

        当然如果我们想获得隐式游标的属性,通过%前边加上SQL即可得到。例如SQL%rowcount.

     

            五,游标简单认识了,我们来看看游标的具体使用:

               1,先看一下简单的使用游标四步骤:

    步骤

    关键词

    说明

    1

    在DECLARE中cursor

    声明游标,创建一个命名的查询语句

    2

    Open

    打开游标

    3

    Fetch

    取出游标中的一条记录装入变量

    4

    Close

    释放游标

     

     

              2,当然游标中可以存放一条数据,也可以存放多条数据,后者是我们用游标,前者我们通过PL/SQL语句即可完成的,这样我们在这里就必须用到循环结构了,在Oracle数据库中我们可以使用while…… loop……end loop , for…… loop……end loop,loop……end loop。在这里需要提出的是,for循环结构在Oracle中被简化了,我们只需要声明和使用即可。看下边这个例子吧:

     

     

    1. declare  
    2.   --定义记录类型的变量  
    3.   v_user user%rowtype;  
    4.   --1,利用cursor关键字声明游标  
    5.   cursor user_cur is  
    6.     select * from user;  
    7. begin  
    8.   --2,打开游标  
    9.   open user_cur;  
    10.   --3,利用fetch读取数据  
    11.   fetch user_cur  
    12.     into v_user;  
    13.   while user_cur%found loop  
    14.     dbms_output.put_line(v_user.userName);  
    15.     fetch user_cur  
    16.       into v_user;  
    17.   end loop;  
    18.   --4,释放游标  
    19.   close user_cur;  
    20. end;  
     
    		declare
    		  --定义记录类型的变量
    		  v_user user%rowtype;
    		  --1,利用cursor关键字声明游标
    		  cursor user_cur is
    		    select * from user;
    		begin
    		  --2,打开游标
    		  open user_cur;
    		  --3,利用fetch读取数据
    		  fetch user_cur
    		    into v_user;
    		  while user_cur%found loop
    		    dbms_output.put_line(v_user.userName);
    		    fetch user_cur
    		      into v_user;
    		  end loop;
    		  --4,释放游标
    		  close user_cur;
    		end;
    

            b,简化的for结构循环:

    declare  
    1.   --1,利用cursor关键字声明游标  
    2.   cursor user_cur is  
    3.     select * from user;  
    4. begin  
    5.   --2,直接使用,Oracle会自动打开和关闭等操作。  
    6.    for v_user in user_cur loop  
    7.        dbms_output.put_line(v_user.userName);  
    8.     end loop  
    9. end;  
     
    		declare
    		  --1,利用cursor关键字声明游标
    		  cursor user_cur is
    		    select * from user;
    		begin
    		  --2,直接使用,Oracle会自动打开和关闭等操作。
    		   for v_user in user_cur loop
    		       dbms_output.put_line(v_user.userName);
    		    end loop
    		end;
    


       这里就介绍这两种的类型,loop的和这都差不多。

              3,最后在这里再学习一下带参数的游标,也是就和我们但参数的类是一样的,只不过一个用在了数据库中,一个用在了编程语言中。

    declare  

    1.   --定义记录类型的变量  
    2.   v_User user%rowtype;  
    3.   --1,利用cursor关键字声明带参数的游标  
    4.   cursor user_Cur(v_UserNo number) is  
    5.     select * from user where  userNo=v_UserNo;  
    6. begin  
    7.   --2,打开带参数的游标,使之更加灵活 。  
    8.   open user_Cur(1012);  
    9.   --3,利用fetch读取数据  
    10.   loop  
    11.        fetch user_Cur into v_User;  
    12.        exit when user_Cur%notfound;  
    13.        dbms_output.put_line(v_user.userName);  
    14.   end loop;  
    15.   --4,释放游标  
    16.   close user_Cur;  
    17. end

    相关文章

      网友评论

        本文标题:《转》数据库-游标

        本文链接:https://www.haomeiwen.com/subject/lmswwttx.html