これは、常に正しい結果を返す SELECT ステートメントを使用したカーソルです。しかし、プロシージャで使用すると、間違った結果が返されることがあります(1行しか返されません)。
この問題は頻繁に発生します (プロシージャ コール 1000 回あたり 5 ~ 10 回)。おそらく、これは oracle 10gR2 の既知の問題か、私の手順のいくつかの欠点です。
1 日に約 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;
前もって感謝します。