`

oracle select for update of ... update where current of ...

阅读更多
oracle syntax:
select for update [of [schema.]table.column[,[schema.]table.column].. ][nowait]

当查询多张表时使用for update [of [schema.]table.column[,[schema.]table.column]..]子句可以锁定指定的表(行级锁),经测试可以同时锁定多张表(行级锁),不过对应使用where current of更新数据时会有问题,这时只能用for update [of [schema.]table.column[,[schema.]table.column]..]语句锁定一张表(行级锁),然后只能更新这张表

构造测试数据:
create table mtj(name varchar2(30),sex varchar2(1),age number(3));
create table lux(name varchar2(30),sex varchar2(1),age number(3));

insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);
insert into mtj values ('mtj','M',28);

insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);
insert into lux values ('lux','M',26);


测试脚本:
declare

  cursor cur_get_person is
    select m.name name_1
      from mtj m, lux l
     where m.sex = l.sex
       for update of l.sex/* ,m.age*/;
begin

  for person in cur_get_person loop
    update lux l set l.age = 11 where current of cur_get_person;
    --update mtj m set m.age = 29 where current of cur_get_person;
  end loop;

end;


另附tom对implicit cursor效率比explicit cursor快的解释
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1205168148688
分享到:
评论

相关推荐

    oracle的update的五种方式

    例如:`BEGIN FOR cr IN (SELECT * FROM t_join_situation WHERE year='2011') LOOP UPDATE t_join_situation SET join_state='1' WHERE current of cr; END LOOP`。这种方式适用于大批量数据的更新,但需要注意游标...

    .Net连接Oracle

    首先,我们需要了解.NET Framework或.NET Core中用于Oracle数据库操作的主要组件——Oracle Data Provider for .NET (ODP.NET)。 1. **ODP.NET介绍** ODP.NET是Oracle公司提供的官方.NET数据访问组件,它允许.NET...

    oracle数据库经典复习试题.pdf

    19. **更新游标**:要更新游标结果集中的当前行,可以使用`WHERE CURRENT OF`子句。 20. **隐式游标**:Oracle为每个SQL语句自动提供了一个隐式游标,用于处理单行查询结果。 21. **包规范**:公共的子程序和常量...

    Oracle游标使用方法及语法大全[整理].pdf

    CURSOR c1 IS SELECT empno, salary FROM emp WHERE comm IS NULL FOR UPDATE OF comm; v_comm NUMBER(10,2); BEGIN FOR r1 IN c1 LOOP IF r1.salary v_comm:=r1.salary*0.25; ELSEIF r1.salary v_comm:=r1....

    oracle期末复习题及答案.doc

    - **解析:** 在Oracle中,使用`WHERE CURRENT OF`子句可以更新游标结果集中的当前行。 - **答案:** A.WHERE CURRENT OF #### 20. 单行查询结果游标 - **题目:** 用于处理得到单行查询结果的游标是什么? - A.循环...

    不同数据库update实现多表更新.doc

    | [ WHERE CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } [ OPTION ( < query_hint > [ ,...n ] ) ] ``` 在SQL Server中,update语句可以使用FROM子句来指定要更新的表,并使用WHERE子句...

    Oracle游标使用方法及语法大全

    CURSOR c_emp FOR SELECT * FROM emp FOR UPDATE OF sal; BEGIN FOR r_emp IN c_emp LOOP IF r_emp.sal UPDATE emp SET sal = r_emp.sal * 1.1 WHERE CURRENT OF c_emp; ELSIF r_emp.sal UPDATE emp SET sal...

    Oracle游标使用方法及语法大全.doc

    使用`WHERE CURRENT OF`子句可以在游标中执行更新或删除操作,此操作需要在声明游标时使用`FOR UPDATE`子句确保数据行锁定。 ```sql DECLARE CURSOR c1 IS SELECT empno, salary FROM emp WHERE comm IS NULL FOR...

    oracle数据库期末考试试题及答案.doc

    **答案**: B.FOR UPDATE **解析**: 使用`FOR UPDATE`子句的`SELECT`语句可以在表的一行或多行上放置排他锁,这意味着其他用户无法对这些行进行更新或删除操作,直到持有锁的事务完成。这种机制通常用于保证数据的...

    oracle语句整理.txt

    UPDATE emp SET sal = emp_record.sal * 1.1 WHERE CURRENT OF emp_cursor; END IF; END LOOP; END; ``` ### 四、异常处理 #### 4. 处理SQL异常 - **语法**: ```sql DECLARE -- variable declaration ...

    oracle期末考试试题及答案.doc

    19. 更新游标结果集中的当前行,应该使用 `WHERE CURRENT OF` 子句。 20. 处理单行查询结果的游标通常为隐式游标,它是Oracle自动创建和管理的。 21. 公用的子程序和常量应该在包规范(Package Specification)中...

    完整word版ORACLE数据库期末考试题目及答案.docx

    - **解析**: 使用WHERE CURRENT OF子句可以在SQL语句中引用游标的当前行。因此,正确答案是**A. WHERE CURRENT OF**。 ### 20. 隐式游标 - **题目**: 用于处理得到单行查询结果的游标为(b)。 - A. 循环游标 - ...

    2021_Oracle实验三(班级-学号-姓名)(5).doc

    UPDATE emp SET salary = salary + v_increase WHERE CURRENT OF c_emp; COMMIT; END LOOP; END; ``` 6. **循环输出特定整数**: 输出 100 以内个位数为 7 的整数,可以使用简单的循环实现: ```sql ...

    oracle期末考试题及答案.doc

    19. 更新游标:使用WHERE CURRENT OF子句可以更新游标结果集中当前行。 20. 单行查询结果的游标:处理单行查询结果通常使用显式游标。 21. 公用子程序和常量:在包标准(Package Specification)中声明,供外部...

    ORACLE数据库期末考试题目及答案.doc

    19. 更新游标:使用`WHERE CURRENT OF`子句可以更新游标结果集中的当前行。 20. 单行查询结果处理:隐式游标自动处理单行查询结果,无需显式声明。 21. 公用子程序和常量声明:这些通常在包标准中声明,形成一个...

    使用游标更新数据库

    * 在 FOR UPDATE 子句中使用 CURRENT OF 指定锁定的列后,程序块中的 UPDATE 语句只能更新 OF 指定的列。 * 如果使用 NOWAIT 子句,那么如果游标结果集中某一行已经被其他用户锁定,那么立即返回并给出错误提示。 * ...

    oracle中游标的使用

    Update teacher set wage=wage*1.2 where current of teacher_cursor; When v_rank='副教授' then Update teacher set wage=wage*1.1 where current of teacher_cursor; Else Update teacher set wage=wage*1.0...

    oracle数据库期末考试试题与答案.doc

    19. **更新游标**:在游标中,使用`WHERE CURRENT OF cursor_name`子句可以更新当前行。 20. **隐式游标**:Oracle在每个SQL语句执行时自动打开一个隐式游标,用于处理单行查询结果。 21. **包规范**:包规范中...

Global site tag (gtag.js) - Google Analytics