WHERE CURRENT OF

本文介绍如何使用WhereCurrentOf语句来更新或删除由游标最近获取的记录。通过具体的函数示例展示了更新及删除操作的具体实现方式。
如果你想删除或者更新被Select For Update引用的记录,你可以使用Where Current Of语句。


UPDATE table_name
    SET set_clause
    WHERE CURRENT OF cursor_name;
OR
DELETE FROM table_name
WHERE CURRENT OF cursor_name;




Where Current Of语句允许你更新或者是删除最后由cursor取的记录。


下面一个使用Where Current Of更新记录的例子:
CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
    cnumber number;
    CURSOR c1
    IS
       SELECT course_number, instructor
        from courses_tbl
        where course_name = name_in
        FOR UPDATE of instructor;


BEGIN
open c1;
fetch c1 into cnumber;


if c1%notfound then
     cnumber := 9999;
else
     UPDATE courses_tbl
        SET instructor = 'SMITH'
        WHERE CURRENT OF c1;
    COMMIT;
end if;


close c1;
RETURN cnumber;
END;


 
Deleting using the WHERE CURRENT OF Statement
Here is an example where we are deleting records using the Where Current Of Statement:
译:下面一个使用Where Current Of删除记录的例子:
CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
    cnumber number;
    CURSOR c1
    IS
       SELECT course_number, instructor
        from courses_tbl
        where course_name = name_in
        FOR UPDATE of instructor;


BEGIN
open c1;
fetch c1 into cnumber;


if c1%notfound then
     cnumber := 9999;
else
     DELETE FROM courses_tbl
        WHERE CURRENT OF c1;
    COMMIT;
end if;


close c1;
RETURN cnumber;
END;


### Oracle 游标中 `WHERE CURRENT OF` 的用法 在 Oracle 数据库中,游标的使用通常涉及显式游标的操作。当需要更新或删除基于当前游标位置的数据时,可以使用 `WHERE CURRENT OF` 子句来实现这一功能[^1]。 #### 基本概念 `WHERE CURRENT OF` 是一种特殊的子句,用于配合游标操作中的 `UPDATE` 或 `DELETE` 语句。它允许开发者针对当前由游标定位的记录执行修改或删除操作。这种机制特别适用于逐条处理数据的情况,能够确保每次只影响一条特定的记录[^2]。 #### 使用场景 该语法主要用于嵌套表 (Nested Table) 和数组类型的复杂查询环境中,尤其是在 PL/SQL 块中定义并使用的显式游标上。通过这种方式,可以在遍历游标的同时动态调整数据库状态。 #### 语法结构 以下是标准的 SQL 结构展示如何结合 `FOR UPDATE` 和 `WHERE CURRENT OF` 来完成目标: ```sql DECLARE CURSOR cur_example IS SELECT column_name FROM table_name FOR UPDATE; BEGIN OPEN cur_example; LOOP FETCH cur_example INTO variable_name; -- 将下一行数据读取到变量 EXIT WHEN cur_example%NOTFOUND; -- 对已获取的行进行更新或者删除操作 DELETE FROM table_name WHERE CURRENT OF cur_example; -- 删除当前行实例 -- OR UPDATE table_name SET column_name = new_value WHERE CURRENT OF cur_example; -- 更新当前行实例 END LOOP; CLOSE cur_example; END; ``` 上述代码片段展示了完整的流程:声明游标、打开游标、循环取出每条记录直至结束以及关闭游标的过程[^3]。 #### 后续关键字说明 - **`FOR UPDATE`**: 这是一个必要的前置条件,在创建游标时指定此选项表示锁定所选行以便后续可能发生的更改。 - **`DELETE` / `UPDATE` Statements**: 只有这两种 DML(Direct Manipulation Language)命令支持跟随 `WHERE CURRENT OF` 子句一起工作[^4]。 注意:如果尝试不带 `FOR UPDATE` 创建游标后再调用 `WHERE CURRENT OF`, 则会引发错误提示 "ORA-01045: missing keyword"。 #### 示例应用案例 假设有一个员工薪资管理系统的简单例子: ```sql CREATE TABLE employees ( emp_id NUMBER PRIMARY KEY, salary NUMBER NOT NULL); -- 插入一些初始测试数据... INSERT INTO employees VALUES(1, 5000); INSERT INTO employees VALUES(2, 7000); COMMIT; DECLARE CURSOR c_emp_salaries IS SELECT * FROM employees FOR UPDATE; v_salary_increase NUMBER := 1000; BEGIN OPEN c_emp_salaries; LOOP FETCH c_emp_salaries INTO :emp_rec; EXIT WHEN c_emp_salaries%NOTFOUND; IF (:emp_rec.salary < 6000) THEN UPDATE employees SET salary = salary + v_salary_increase WHERE CURRENT OF c_emp_salaries; END IF; END LOOP; COMMIT; CLOSE c_emp_salaries; END; / ``` 在这个脚本里,我们提高了那些薪水低于一定数额的所有雇员们的工资水平,并且利用了 `WHERE CURRENT OF` 技术保证仅作用于当前迭代项之上[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值