Kbase P8652: Error 1471 occurs when Oracle DataServer does not reuse cursorid
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  10/15/2008 |
|
Status: Verified
FACT(s) (Environment):
Oracle DataServer
Progress 9.1x
SYMPTOM(s):
SYSTEM ERROR: Foreign database cursor <num> not found. (1471)
SYSTEM ERROR: Foreign database cursor 0 not found. (1471)
Progress client GPFs
CAUSE:
Bug# 20021030-020
CAUSE:
This is a known issue being investigated by Progress Development.
Here are the conditions that instigate this problem
1. Client tells the Oracle DataServer that a query is being performed
2. For each file that is open, the server reviews an internal list of active cursorids that are being used.
3. The server finds the highest cursor on the list and increments the next value by 1.
4. It then assigns this value to the client.
5. This process goes on until the cursorid value reaches a value of 8192.
6. 8192 is the value defined for JOINs, so the server goes to another list (for JOINs) to obtain the correct cursorid value.
7. However, no JOIN is being performed, thus the server cannot find an active cursorid on the list, returning a value of 0 to the client.
Even when CLOSE QUERY is being specified, cursorid's are not being closed/removed off the internal list (for reuse) which then causes confusion to the server when it reaches the value of 8192.
The following program duplicates the problem against SPORTS.
def var i as int no-undo.
def query q0 for state.
def query q1 for state.
open query q0 for each state where region = 'East'.
get first q0.
do i = 1 to 18000:
if i mod 2 = 1 then do:
open query q1 for each state where state = 'NH'.
get next q1.
close query q0.
end. else do:
open query q0 for each state where region = 'East'.
get first q0.
close query q1.
end.
if i mod 250 = 0 then display i.
end.
Open query q0, --> designates cursorid 1
open query q1-----> designates cursorid 2
close query q0---> removes cursorid 1
in the else do: open q0----> designates cursorid 3
close query q1-----> removes cursorid 2 etc...... when it reaches 8192 (the magic number of where the dsv thinks that there is JOIN going on and the server goes to another list to find the JOIN cursorid number) ---> but there is no cursors within the JOIN list and the client receives a value of cursorid 0
FIX:
Fixed in Progress Service Pack 9.1D05 to correct the problem.