数据库管理系统中的游标
每当执行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等属性。第二种是显式游标,它可以大规模控制上下文区域。创建显式游标的步骤是:初始化、分配内存、提取数据和释放已分配的内存。