The*_*bhi 3 oracle plsql cursor oracle11g
我有一个程序,在 oracle 11g 中经常出现以下错误:
ORA-01002: fetch out of sequence ORA-06512:
at "LEAVE.GES_ERP_LEV_FFS_INTERFACE_PRC", line 350 ORA-06512: at line 1.
Run Code Online (Sandbox Code Playgroud)
在第 350 行我有-
BEGIN
FOR V_INTERFACE_EMP IN CUR_INTERFACE_EMP LOOP (Line 350)
EXIT WHEN CUR_INTERFACE_EMP%NOTFOUND;
V_ERR_FLAG := 'N';
V_LOCAL_EMP := 'Y';
BEGIN
Run Code Online (Sandbox Code Playgroud)
游标 CUR_INTERFACE_EMP 声明如下
SELECT GELF.*
FROM GES_ERP_LEV_FFS_INTERFACE_T GELF
WHERE (GELF.BALANCE_FLAG != 'W'
OR GELF.CASE_FLAG = 'S'
OR SELF.BALANCE_FLAG IS NULL)
AND GELF.PROCESS_FLAG = 'N'
AND GELF.DATE_OF_RELEASE <= TRUNC(SYSDATE);
Run Code Online (Sandbox Code Playgroud)
如果我使用 Process_Flag Y 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。
请帮助,如果上述表格也需要数据,请告诉我。
如果我使用 Process_Flag Y 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。
您尝试从 SELECT FOR UPDATE 中获取数据,但在此之前已经发出了 COMMIT。
我认为您在循环内的某处有一个COMMIT导致了此问题。
引用汤姆·凯特的一句话:
Run Code Online (Sandbox Code Playgroud)for x in ( select rowid rid, t.* from T ) loop update T set x = x+1 where rowid = x.rid; commit; end loop;该隐式游标是从“跨提交”获取的。这是提交后保持游标打开的做法。这是一种不好的做法,并且是 ORA-1555 的常见原因(特别是上面的循环构造)
另外,您正在使用CURSOR FOR LOOP。当游标中的所有记录都已获取时,CURSOR FOR LOOP 将终止。因此,您不需要显式退出。
你可以简单地这样做:
FOR V_INTERFACE_EMP IN CUR_INTERFACE_EMP
LOOP
V_ERR_FLAG := 'N';
V_LOCAL_EMP := 'Y';
...
END LOOP;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81009 次 |
| 最近记录: |