数据库管理系统中的游标


每当执行DML语句时,都会在系统内存中建立一个称为游标的临时工作区。尽管游标可能包含多行,但在处理方面,一次只考虑一行。游标对Oracle、Mysql、SQL Server等类型的DBMS非常有帮助。游标是用于遍历数据库记录的控制结构,并用于数据库中。

游标分为两种类型

  • 隐式游标

  • 显式游标

隐式游标

如果不对语句使用显式游标,则在执行SQL语句时,Oracle将创建隐式游标。一些用于隐式游标以检查DML操作状态的属性是%ROWCOUNT、%ISOPEN、%FOUND和%NOTFOUND。

%ROWCOUNT

它显示SELECT INTO命令产生的行数或受INSERT、DELETE和UPDATE等DML操作影响的行数。

%ISOPEN

鉴于相关的SQL语句执行完毕后,SQL游标会自动关闭,因此它始终对隐式游标返回FALSE。

%FOUND

如果SELECT INTO命令产生了一行或多行,或者如果INSERT、DELETE和UPDATE等DML操作影响了一行或多行,则其返回结果为TRUE。否则,返回FALSE。

%NOTFOUND

如果SELECT INTO命令产生了一行或多行,或者如果INSERT、DELETE和UPDATE等DML操作影响了一行或多行,则其返回结果为TRUE。否则,返回FALSE。

%NOTFOUND

如果INSERT、DELETE和UPDATE等DML操作没有影响任何行,或者SELECT INTO命令没有返回任何行,则其返回结果为TRUE。否则,返回FALSE。它与%FOUND正好相反。

示例

创建一个学生表并添加记录。

算法

  • 步骤1:声明要受影响的行总数。

  • 步骤2:使用BEGIN

  • 步骤3:将学生的成绩更新为加5。

  • 步骤4:使用if条件判断%notfound

  • 步骤5:打印未更新记录的输出。

  • 步骤6:使用else if条件判断%found

  • 步骤7:声明%rowcount的数量等于总行数。

  • 步骤8:显示总行数中已更新的行总数。

  • 步骤9:关闭END

  • 步骤10:显示更新后的表

输入

学生

Student ID      First Name   Last Name	 Address  Marks
  1	         Rahul	     Raj	 Delhi	   92
  2	         Saksham     Pandey	 Lucknow   81
  3	         Amresh      Rao	 Panipat   91
  4	         Sumit	     Patil	 Pune	   61
  5	         Sneha	     Singh	 Kochi	   75

使用SQL%ROWCOUNT属性更新表并为每个学生的成绩增加5分。

示例

DECLARE  
   total_rows number(2);  #Declaring the total number of rows to be affected
BEGIN 
   update students marks= marks + 5;  #Updating students marks by 5
   if sql%notfound then  #Using if condition for %notfound
      dbms_output.put_line('Records not updated’);   #Printing the result of %notfound
   elseif sql%found then  #Using elseif for %found
      total_rows:= sql%rowcount;  #Total rows will be equal to the total row count
      dbms_output.put_line(‘total rows updated: ’ || total_rows );  #Printing the result of total rows updated in total rows
   end if;  
END; #Closing the END
SELECT * FROM Students;#to show the updated table

输出

Student ID  First Name  Last Name  Addres    Marks 
1           Rahul       Raj        Delhi     97
2           Saksham     Pandey     Lucknow   86
3           Amresh      Rao        Panipat   96
4           Sumit       Patil      Pune      66
5           Sneha       Singh      Kochi     80

显式游标

程序员定义显式游标是为了在上下文区域上拥有更大的控制范围。它必须在PL/SQL块的声明部分定义。

语法

CURSOR cursor_name IS select_statement;

创建显式游标的步骤:

  • 初始化游标内存

    CURSOR <游标名称> IS SELECT <所需字段> FROM <表名>;

  • 分配游标内存

    OPEN <游标名称>;

  • 提取检索数据

    FETCH <游标名称> INTO <相应列>;

  • 释放已分配的内存

    CLOSE <游标名称>;

示例

在这个例子中,我们将看到如何使用显式游标。

算法

  • 步骤1:声明受影响的细节

  • 步骤2:初始化内存

  • 步骤3:使用Begin

  • 步骤4:分配内存

  • 步骤5:创建一个循环

  • 步骤6:提取数据

  • 步骤7:如果数据未找到则结束循环

  • 步骤8:释放已分配的内存

输入

学生

Student ID	Name	   Address	  Marks
  1	        Rahul	   Delhi	    97
  2	        Saksham	   Lucknow          86	  
  3	        Amresh     Panipat          96	   
  4	        Sumit	   Pune	            66
  5	        Sneha	   Kochi	    80

示例

DECLARE  
   s_id student.id%type; #declaring the id 
   s_name student.name%type;  #declaring the name
   s_addr student.address%type;  #declaring the address
   CURSOR s_student is SELECT id, name, address FROM student; #initialising the memory 
BEGIN  
   OPEN s_student;  #memory allocating 
   LOOP  #creating a loop
      FETCH  s_student into s_id, s_name, s_addr;  #fetching the data 
      EXIT WHEN s_student%notfound;  #condition if data not found
   END LOOP;  #closing the loop

输出

Student ID	Name	  Address
  1	        Rahul	  Delhi
  2	        Saksham	  Lucknow
  3	        Amresh 	  Panipat
  4	        Sumit	  Pune
  5	        Sneha	  Kochi

结论

本文介绍了在DBMS中使用的游标。游标分为两种类型。第一种是隐式游标,当我们不使用显式游标时创建。隐式游标下使用%rowcount、%isopen、%found和%notfound等属性。第二种是显式游标,它可以大规模控制上下文区域。创建显式游标的步骤是:初始化、分配内存、提取数据和释放已分配的内存。

更新于:2023年7月14日

5000+ 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告