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