`

(转)oracle.for update,更新游标,cursor

 
阅读更多

http://blog.csdn.net/yanleigis/article/details/2950208

oracle dml select for update syntax examples

在多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,PL/SQL提供了进行这样处理的一种语法。
这种语法包括两部分——在游标声明部分的FOR UPDATE子句和在UPDATE或DELETE语句中的WHERE CURRENT OF 子句。 
通常,SELECT操作将不会对正处理的行执行任何锁定设置,这使得连接到该数据库的其他会话可以改变正在选择的数据。 
但是,结果集仍然是一致性的。当确定了活动集以后,在执行OPEN的时刻,ORACLE会截取下该表的一个快照。在此时刻以前所提交的任何更改操作都会在活动集中反映出来。在此时刻以后所进行的任何更改操作,即使已经提交了它们,都不会被反映出来,除非将该游标重新打开。但是使用FOR UPDATE子句,在OPEN返回以前的活动集的相应行上会加上互斥锁,这些锁会避免其他的会话对活动集中的行进行更改。直到整个事务被提交为止。 

示例: 
DECLARE 
CURSOR C_CUR IS SELECT * FROM STUDENDS FOR UPDATE OF XM; 
BEGIN 
OPEN C_CUR; 
WHILE C_CUR%FOUND LOOP 

UPDATE STUDENDS SET XM='AA'||XM WHERE CURRENT OF C_CUR; 

END LOOP; 
CLOSE C_CUR; 
COMMIT; 
END; 


需要注意的是:1、UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列(这句话有错误,经试验和查询证明,UPDATE语句可以更新游标声明的FOR UPDATE中涉及到的表的所有列)。如果没有列出任何列,那么所有的列都可以更新。 
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。
在定义又表示必须要带有for update子句,用于在游标结果集数据上加行共享锁,以防止其他用户在相应行上执行dml操作;当select语句引用到多张表时,使用of子句可以确定哪些表要加锁,如果没有of子句,则会在select语句所引用的全部表上加锁;nowait子句用于指定不等待锁。在提取了游标数据之后,为了更新或删除当前游标行数据,必须在update或delete语句中引用where current of 子句。 
--1、使用游标更新数据 
Java代码  收藏代码
  1. declare  
  2. cursor emp_cursor is  
  3. --加行共享锁  
  4. select t.name,t.english_name from communitytype t for update;  
  5. --定义变量  
  6. v_name communitytype.name%type;  
  7. v_enname communitytype.english_name%type;  
  8. begin  
  9. --打开游标  
  10. open emp_cursor;  
  11. loop  
  12. fetch emp_cursor into v_name,v_enname;  
  13. exit when emp_cursor%notfound;  
  14. if v_name = '电子图书' then  
  15. update communitytype c  
  16. set c.english_name = 'ebook'  
  17. where current of emp_cursor;  
  18. end if;  
  19. end loop;  
  20. close emp_cursor;  
  21. commit;  
  22. end;  

--2、使用游标删除数据,同上只需要将更新语句换成删除语句 
--3、使用of子句在特定表上加行共享锁 
Java代码  收藏代码
  1. declare  
  2. cursor emp_cursor is  
  3. --加行共享锁  
  4. select t.name,t.english_name from communitytype t for update of t.name;  
  5. --定义基于游标的记录变量  
  6. emp_record emp_cursor%rowtype;  
  7. begin  
  8. --打开游标  
  9. open emp_cursor;  
  10. loop  
  11. fetch emp_cursor into emp_record;  
  12. exit when emp_cursor%notfound;  
  13. if emp_record.name = '电子图书' then  
  14. update communitytype c  
  15. set c.english_name = 'ebook'  
  16. where current of emp_cursor;  
  17. end if;  
  18. end loop;  
  19. close emp_cursor;  
  20. commit;  
  21. end;  

--4、默认情况下当前会话要一直等待对方释放锁,使用nowait子句可以避免等待锁 
Java代码  收藏代码
  1. declare  
  2. cursor emp_cursor is  
  3. --加行共享锁  
  4. select t.name,t.english_name from communitytype t for update nowait;  
  5. --定义基于游标的记录变量  
  6. emp_record emp_cursor%rowtype;  
  7. begin  
  8. --打开游标  
  9. open emp_cursor;  
  10. loop  
  11. fetch emp_cursor into emp_record;  
  12. exit when emp_cursor%notfound;  
  13. if emp_record.name = '电子图书' then  
  14. update communitytype c  
  15. set c.english_name = 'ebook'  
  16. where current of emp_cursor;  
  17. end if;  
  18. end loop;  
  19. close emp_cursor;  
  20. commit;  
  21. end;  
分享到:
评论

相关推荐

    Oracle面试题

    2. 显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的...

    Oracle 游标使用总结

    隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建...

    21天学习SQL V1.0

    21天学习SQL V1.0.pdf 66 SQL 21 日自学通(V1.0) 翻译人笨猪 ...日期/时间函数............................................................................................................ADD_MONTHS..................

    PL/SQL 基础.doc

    3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [变量名] [表名.字段名] [%TYPE] 表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE;...

    sql总结.doc

    它还提供对基于游标位置而对表中数据进行删除或更新的能力 缺点: 处理大数据量时,效率低下,占用内存大 (6)什么时候选择使用游标? 一般是在循环处理的时候使用。 比如你判断一个班上的同学数学成绩怎么样,你...

    精通SQL 结构化查询语言详解

    17.2.1 使用DECLARE CURSOR语句创建游标  17.2.2 使用OPEN/CLOSE语句打开/关闭游标  17.2.3 使用FETCH语句检索数据  17.2.4 基于游标的定位DELETE语句  17.2.5 基于游标的定位UPDATE语句 17.3 SQL Server...

    Oracle中游标Cursor基本用法详解

    查询  SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中。...如果超过一行数据,那么就要使用显式游标

    精通SQL--结构化查询语言详解

    17.2.1 使用declare cursor语句创建游标 351 17.2.2 使用open/close语句打开/关闭游标 352 17.2.3 使用fetch语句检索数据 352 17.2.4 基于游标的定位delete语句 354 17.2.5 基于游标的定位update语句 356 17.3 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。  删除环境变量中的PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有...

    oracle实验报告

    (5)在未使用显式游标的情况下,使用SELECT语句必须保证只有一条记录返回,否则会产生异常情况。 [例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_...

    精通sql结构化查询语句

    11.1.4 由VALUES关键字插入多行数据 11.1.5 使用SELECT语句插入数据 11.1.6 通过视图插入数据 11.1.7 使用子查询插入数据 11.2 数据的更新操作 11.2.1 UPDATE语句的基本语法 11.2.2 使用UPDATE语句更新指定的列值 ...

    Oracle9i的init.ora参数中文说明

    只有行锁将用于SELECT FOR UPDATE, 但在更新时将获取表锁。 值范围: ALWAYS | DEFAULT | INTENT 默认值: ALWAYS shared_servers 说明 : 指定在启动例程后, 要为共享服务器环境创建的服务器进程的数量。 值范围: ...

    Oracle事例

    sql> alter index xay_id allocate extent(size 200k datafile \'c:/oracle/index.dbf\'); <8>.alter index xay_id deallocate unused; 、查看索引 SQL>select index_name,index_type,table_name from user...

    PL/SQL Developer8.04官网程序_keygen_汉化

     1 显示游标 显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。 在PL/SQL中处理显示游标所必需的四个步骤:  1)声明游标;CURSOR cursor_name IS select_...

    xls转mdb代码以及.exe执行软件

    set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U''' exec(@m_tbname) open #tb fetch next from #tb into @m_tbname while @@fetch_status=0 begin set @sql='bcp...

    PLSQLDeveloper下载

    定义游标的语法结构如下: cursor cursor_name is SQL语句; 在本文第一段代码中有一句话如下: cursor c_emp is select * from employee where emp_id=3; 其含义是定义一个游标c_emp,代表employee表中所有emp_id...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    SQL21日自学通

    Developing Personal Oracle7 for Windows 95 Applications 525 Teach Yourself C++ Programming in 21 Days 525 Teach Yourself Tansact-SQL in 21 Days 525 Teach Yourself PL/SQL in 21 Days 525 杂志526 DBMS526...

    OraclePLSQL编程经典例子

    ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分...

    mysql数据库的基本操作语法

    注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改 但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) ...

Global site tag (gtag.js) - Google Analytics