DBMS 中的游标

dbmsdatabaseprogramming

每当执行 DML 语句时,系统内存中都会建立一个称为游标的临时工作区。虽然游标可能包含多行,但从处理角度来看,只考虑一行。游标对 Oracle、Mysql、SQL 服务器等 DBMS 非常有用。游标是一种用于浏览数据库记录的控制结构,用于数据库中。

游标有两种类型

  • 隐式游标

  • 显式游标

隐式游标

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

%ROWCOUNT

它显示由 SELECT INTO 命令生成的行数或受 DML 操作(如 INSERT、DELETE 和 UPDATE)影响的行数。

%ISOPEN

由于 SQL 游标在执行相关 SQL 语句时会自动关闭,因此它对于隐式游标始终返回 FALSE。

%FOUND

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

%NOTFOUND

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

%NOTFOUND

如果没有行受到 DML 操作(如 INSERT、DELETE 和 UPDATE)的影响,或者 SELECT INTO 命令未返回任何行,则其返回结果为 TRUE。否则,返回 FALSE。它与 %FOUND 直接相反。

示例

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

算法

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

  • 步骤 2:使用 BEGIN

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

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

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

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

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

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

  • 步骤 9:结束 END

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

输入

Students

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 <cursorName> IS SELECT <Required fields> FROM <tableName>;

  • 用于分配内存的游标

    OPEN <cursorName>;

  • 用于获取检索数据的游标

    FETCH <cursorName> INTO <各自的列>;

  • 用于释放已分配内存的游标

    关闭<cursorName>;

示例

在此示例中,我们将了解如何使用显式游标。

算法

  • 步骤 1:声明受影响的详细信息

  • 步骤 2:初始化内存

  • 步骤 3:使用 Begin

  • 步骤 4:分配内存

  • 步骤 5:创建循环

  • 步骤 6:获取数据

  • 步骤 7:判断数据是否未找到,并结束循环

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

输入

Student

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 等属性。第二种是显式游标,它在大范围内控制上下文区域。创建显式游标的步骤是初始化、分配内存、获取数据和释放分配的内存。


相关文章