Обнаружен символ «IS» при ожидании одного из следующих - PullRequest
0 голосов
/ 29 февраля 2012

Я пытался запустить этот скрипт, но все, что я получаю, это ошибка:

Error report:
ORA-06550: line 3, column 15:

PLS-00103: Encountered the symbol "IS" when expecting one of the following:

constant exception <an identifier>
<a double-quoted delimited-identifier> table long double ref
char time timestamp interval date binary national character
nchar
The symbol "IS" was ignored.

Вот мой скрипт:

set serveroutput on

   DECLARE
   cursor depts_cur is select dname from dept;
   depts_cur_rec is depts_cur%type; 

   BEGIN
   loop
     fetch depts_cur into depts_cur_rec;
     exit when depts_cur_rec%notfound;
     dbms_output.put_line('Department: ' || depts_cur_rec);
   end loop;
   close depts_cur;
   END;

Ваша помощь будет высоко оценена.

Ответы [ 2 ]

6 голосов
/ 29 февраля 2012

Похоже, ваше объявление depts_cur_rec неверно, попробуйте это (убрав "is"):

set serveroutput on

DECLARE
    cursor depts_cur is select dname from dept;
    depts_cur_rec depts_cur%type;
BEGIN
    BEGIN loop 
        fetch depts_cur 
        into depts_cur_rec; 
        exit when depts_cur_rec%notfound;
        dbms_output.put_line('Department: ' || depts_cur_rec); 
    end loop;
    close depts_cur;
END;
1 голос
/ 29 февраля 2012

Прежде всего, когда вы объявляете локальную переменную, такую ​​как 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;
...