fetch与commit问题

[复制链接]
查看11 | 回复4 | 2011-5-7 01:45:08 | 显示全部楼层 |阅读模式
现在有一个存储过程要用到cursor
而且是加for update的
如果我在循环中fetch一他要数据进行处理后
马上commit,
然后再fetch下一条数据进行处理,处理完了再commit
这样编译是没问题
但在执行时出现错误
ORA-01002: 读取违反顺序
ORA-06512: 在"JWGL.PCKGSTUDSLTCOURSE", line 62
ORA-06512: 在line 2

15:37:00 Error: ORA-06550: 第 2 行, 第 0 列:
PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
begin case declare
exit for goto if loop mod null pragma raise return select
update while with
<<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge
pipe

如果我在处理完一条数据后不commit
而是等所有数据全部处理完后
在循环结束后再commit
一切就OK了
是不是commit后不能再fetch数据了?
而要重新open 游标?
回复

使用道具 举报

千问 | 2011-5-7 01:45:08 | 显示全部楼层
SELECT FOR UPDATE会给你查询的表加锁,当你commit后,锁就释放了,游标也变成无效的了。
如果非要在fetch过程中进行提交,可以考虑使用自治事务。
回复

使用道具 举报

千问 | 2011-5-7 01:45:08 | 显示全部楼层
原来如此
在open cursor时
就马上对所有查到的数据加了锁么?
回复

使用道具 举报

千问 | 2011-5-7 01:45:08 | 显示全部楼层
最初由 horizon 发布
[B]原来如此
在open cursor时
就马上对所有查到的数据加了锁么? [/B]

那是当然.
直到事务提交或回滚.
回复

使用道具 举报

千问 | 2011-5-7 01:45:08 | 显示全部楼层
在用for update时对select子句有什么限制?
能用orderby ,group by之类的子句么?
现在我换成这个select子句时出现下面错误
是不是嵌套select的问题?
如果是的话,那我如何用for update 表tblstudentsltcourse呢?
CURSOR curStudSltCourse(vyears varchar2, vtermID varchar2) IS
select t.rowsID,studentID,years,termID,sltCourseID,sltTime,processStatus,serverNO
from tblstudentsltcourse t
where (t.years = vyears) and

(t.termID = vtermID)
order by t.sltTime
for update ;
ORA-06550: 第 2 行, 第 0 列:
PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
begin case declare
exit for goto if loop mod null pragma raise return select
update while with 《an identifier》
《a double-quoted delimited-identifier》 《a bind variable》
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge
《a single-quoted SQL string》 pipe
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行