ORA-01001: неверный курсор в запросе с использованием цикла for - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь написать простой запрос, используя курсоры, но продолжаю получать эту пресловутую ошибку «недопустимый курсор». Вот мой код.

DECLARE
    v_deptno NUMBER := 10;
    c_last_name employees.last_name%TYPE;
    c_salary employees.salary%TYPE;
    c_manager_id employees.salary%TYPE;
    CURSOR c_emp_cursor IS
        SELECT last_name, salary, manager_id FROM employees
        WHERE department_id = v_deptno;
BEGIN
   --OPEN c_emp_cursor;
-- commented out because for loop opens the cursor automatically
    FOR employee IN c_emp_cursor
    LOOP
        FETCH c_emp_cursor INTO c_last_name, c_salary, c_manager_id;
            EXIT WHEN c_emp_cursor%NOTFOUND;
            IF c_salary < 5000 THEN
                IF c_manager_id = 101 OR c_manager_id = 124 THEN
                    dbms_output.put_line(c_last_name || 'due for a raise.');
                ELSE
                    dbms_output.put_line(c_last_name || ' not due for a raise.');
                END IF;
            END IF;
    END LOOP;
    --CLOSE c_emp_cursor;
END;

Что может быть не так и каково решение для этого? Я уже пытался применить возможные решения для похожих вопросов, но ни один из них не соответствует моей проблеме.

1 Ответ

4 голосов
/ 01 ноября 2019

Как вы прокомментировали OPEN и CLOSE, вы должны удалить также FETCH и EXIT по той же причине. Кроме того, теперь у вас есть переменная курсора в операторе FOR, так что используйте ее. Как то так:

BEGIN
    FOR employee IN c_emp_cursor
    LOOP
            IF employee.salary < 5000 THEN
                IF employee.manager_id = 101 OR employee.manager_id = 124 THEN
                    dbms_output.put_line(employee.last_name || 'due for a raise.');
                ELSE
                    dbms_output.put_line(employee.last_name || ' not due for a raise.');
                END IF;
            END IF;
    END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...