0

これは、常に正しい結果を返す 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;

前もって感謝します。

4

0 に答える 0