Прежде всего, когда вы объявляете локальную переменную, такую как depts_cur_rec
, вы не используете ключевое слово IS
.И вы хотите, чтобы depts_cur_rec
был объявлен как %ROWTYPE
, а не %TYPE
.Как только вы пройдете через это, ваш код потерпит неудачу, потому что вы не открываете курсор перед извлечением и потому что вы пытаетесь использовать атрибут %NOTFOUND
записи, а не курсор.И, наконец, ваш вызов DBMS_OUTPUT
должен ссылаться на определенный столбец из записи
DECLARE
cursor depts_cur is select dname from dept;
depts_cur_rec depts_cur%rowtype;
BEGIN
open depts_cur;
loop
fetch depts_cur into depts_cur_rec;
exit when depts_cur%notfound;
dbms_output.put_line('Department: ' || depts_cur_rec.dname);
end loop;
close depts_cur;
END;
Однако, вероятно, гораздо проще просто использовать неявные курсоры, а не явные курсоры для такого рода вещей.Таким образом, нет необходимости вручную указывать OPEN
, FETCH
или CLOSE
.Нет необходимости вручную определять, когда выходить из цикла.Нет необходимости вручную объявлять тип записи.Вы просто позволяете Oracle обрабатывать это
BEGIN
FOR dept_rec IN (SELECT dname
FROM dept)
LOOP
dbms_output.put_line( 'Department: ' || dept_rec.dname );
END LOOP;
END;
Если вы хотите объявить курсор вне строки, вы можете сделать это и с неявными курсорами
DECLARE
CURSOR depts_cur
IS SELECT dname
FROM dept;
BEGIN
FOR dept_rec IN depts_cur
LOOP
dbms_output.put_line( 'Department: ' || dept_rec.dname );
END LOOP;
END;