SELECT s.col INTO s_col
FROM sTable s
WHERE s.id = 1
FOR UPDATE;
FROM sTable s
WHERE s.id = 1
FOR UPDATE;
解决方案 »
- 高分求SQL处理
- OracleOraHome92ClientCache 1067错误
- oracle11g em乱码
- 请教程序开发c/c++3年,对oracle感兴趣,可以往什么方向发展。谢谢
- 南北软件面试题目。。。。。。。。。。谁能做出来?
- 求教!!oracle数据库无法启动
- sql server 中基础概念 如何和oracle中的对应起来,和谁对应?up 有分
- 在oracle817 for solaris中创建了一个新的数据库A,重起后如何启动A?
- 讲oracle基础的课程我该从哪出发?晚10点结帐!加急!回答的人越多越好!分不够再加~
- select 1 from dual where NVL(NULL,'') = NVL(NULL,'')为啥没结果啊?求助大神们~~
- oracle判断问题,答对马上就给分 在线
- 请教一条两个表中的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子句处列出的列。如果没有列出任何列,那么所有的列都可以更新。
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。
查询结果集被锁定,不被修改