这是我的带有 SELECT 语句的游标,它总是返回正确的结果。但是当我在程序中使用它时,有时会得到错误的结果(只返回一行)。
这个问题出现的频率很高(每 1000 个过程调用约 5-10 次)。也许这是 oracle 10gR2 的已知问题或我的程序中的一些缺点。
我希望我能理解为什么会发生这种情况并获得更好的解决方案,因为我每天会接到大约 5000 个程序调用。
这是我在程序中声明的光标:
CURSOR cur_result (var_num NUMBER)
IS
SELECT
m_username,
m_password
FROM
M_USERS
WHERE
m_status = 1
AND rownum <= var_num;
这是我的程序主体:
p_num:=5;
-- the IF statement for guarantee the SELECT statement always
-- get more rows than p_num
LOCK TABLE M_USERS IN EXCLUSIVE MODE;
OPEN cur_result (p_num);
LOOP
FETCH
cur_result
INTO
p_username,
p_password;
-- the problems here: only 1 row is queried
-- the LOOP will exit after second time fetch
IF (cur_result%NOTFOUND AND (cur_result%ROWCOUNT < p_num) ) THEN
iserror := 1;
EXIT;
END IF;
EXIT WHEN cur_result%NOTFOUND;
UPDATE
M_USERS
SET
m_status = 2
WHERE
m_username = p_username
AND m_password = p_password;
END LOOP;
CLOSE cur_result;
提前致谢。