Ошибка PLSQL: обнаружен символ при ожидании: в процедуре

Я новичок в PL/SQL, написал процедуру и не смог обнаружить ошибку.
Детали реализации:
Я использую несколько курсоров для перемещения по таблице и сохранения некоторых важных данных во вложенной таблице (TYPE .. IS TABLE OF varchar(8)).
В частности, таблица предварительных требований хранит предварительные курсы данного курса. Мне нужно найти непосредственные пререкы данного курса и пререкы пререков, если таковые имеются.
Код:
преколл здесь,

TYPE precoll IS TABLE of varchar2(8);

объявлен в пакете, а процедура ниже находится в теле пакета. Процедура:

procedure disp_prereq(p_dept_code IN varchar2, p_courseno IN number, c_prereq OUT SYS_REFCURSOR)
IS
counter INTEGER ;
preserved INTEGER ;
prelist precoll := precoll();
row prerequisites%ROWTYPE;
BEGIN
        counter := 1;
        preserved := 1;
    cursor cr is select * from prerequisites where dept_code = p_dept_code and course# = p_courseno;
        open cr;
        loop
                fetch cr into row;
                exit when row%notfound;
                prelist(counter) := (row.pre_dept_code || row.pre_course#) ;
                counter := counter + 1;
        end loop;
        close cr;
        preserved := prelist.count;
        preserved := preserved + 1;
        counter := 1;
        cursor indr is select * from prerequisites;
        open indr;
        loop
                fetch indr into row;
                exit when row%notfound;
                if (prelist(counter) = (m.dept_code||m.course#)) then
                        prelist(preserved) := m.pre_dept_code||m.pre_course# ;
                        preserved := preserved + 1;
                end if;
                counter := counter + 1;
        end loop;
        close indr;
        open c_prereq FOR select * from prelist;
END disp_prereq;

и сообщение об ошибке дало мне:


62/9     PLS-00103: Encountered the symbol "CR" when expecting one of the
         following:
         := . ( @ % ;
И мой второй вопрос, предварительный список - это переменная precoll (TYPE precoll IS TABLE of varchar2 (8);) Могу ли я запросить TYPE precoll с помощью запроса выбора, потому что это таблица varchar?


person Natha Kamat    schedule 29.04.2013    source источник
comment
Объявление курсора CR должно быть перемещено перед ключевым словом begin (в разделе объявлений).   -  person Egor Skriptunoff    schedule 29.04.2013


Ответы (1)


Вопрос 1: Курсоры должны быть объявлены в строке объявления процедуры. Переместите:

cursor cr is select * from prerequisites where dept_code = p_dept_code and course# = p_courseno;

строка до BEGIN. То же самое касается другого курсора (indr). (Существует также альтернативный синтаксис, когда вы объявляете переменную курсора в разделе объявления, а затем используете OPEN cursor_variable FOR SELECT ....)

Вопрос 2: Да. В твоем случае:

В разделе объявления:

prelist precoll;
cur cursor;

В разделе кода:

open cur for 
  SELECT * FROM table(prelist);

Вот еще один пример из Спросите Тома.

person Klas Lindbäck    schedule 29.04.2013
comment
Спасибо, вы точно ответили на мои вопросы, я попробую это. - person Natha Kamat; 29.04.2013
comment
Первая проблема решена. Но второй, он говорит, что таблица «предварительный список» не найдена, такой таблицы нет. Что я должен написать в запросе, имя типа или имя переменной этого типа? - person Natha Kamat; 29.04.2013
comment
Название типа: преколл. Имя переменной: prelist. - person Natha Kamat; 29.04.2013
comment
Вам нужно указать PL/SQL экспортировать таблицу в SQL, написав TABLE(prelist). Я добавил больше текста в вопросе 2 в своем ответе. - person Klas Lindbäck; 29.04.2013