PLS-00103: Обнаружен символ «конец файла» при ожидании одного из следующего:; - PullRequest
11 голосов
/ 06 августа 2011

Я запускаю следующий скрипт -

BEGIN
    select department_name 
    from egpl_department 
    where department_id in (select department_id 
                            from egpl_casemgmt_activity);
END ;

и получил ошибку -

PLS-00103: Encountered the symbol "end-of-file" when 
expecting one of the following: 
;

Ответы [ 4 ]

15 голосов
/ 06 августа 2011

В операторе выбора блока PL / SQL должно быть предложение into:

DECLARE
 v_department egpl_department.department_name%type;
BEGIN 
  select department_name 
  into   v_department
  from   egpl_department 
  where  department_id in (select department_id from egpl_casemgmt_activity); 

  -- Do something useful with v_department
END; 
8 голосов
/ 06 августа 2011

В PL / SQL вы не можете просто выбрать некоторые данные. Куда должен идти результат?

Ваши варианты:

  • Удалите BEGIN и END и запустите SELECT с SQL * plus или другим инструментом, который может выполнить инструкцию SQL и представить результат где-нибудь.

  • Используйте SELECT department_name INTO dep_name для помещения результата в переменную PL / SQL (работает, только если ваш SELECT возвращает одну строку)

  • Используйте SELECT department_name BULK COLLECT INTO dep_name_table, чтобы поместить результат в таблицу PL / SQL (работает для нескольких строк)

Или, может быть, вы можете описать, чего вы пытаетесь достичь и в какой среде вы хотите запустить код SQL или PL / SQL.

7 голосов
/ 07 августа 2011

PLS-00103 всегда означает, что компилятор швырнул, потому что мы сделали синтаксическую ошибку. Было бы очень здорово, если бы текст сообщения гласил: You have made a syntax error, please check your code, но, увы, нет.

Документация Oracle является полной и онлайн. Вы можете найти раздел об интеграции SQL-запросов в PL / SQL здесь . Я призываю вас прочитать это, чтобы предотвратить ваш следующий вопрос. Потому что, как только вы исправите простой синтаксис Bloomer, вы нажмете TOO_MANY_ROWS (при условии, что у вас более одного отдела).

4 голосов
/ 07 августа 2011

Чтобы избежать проблемы too_many_rows, вы можете использовать курсор, что-то вроде этого (я не проверял это, но по этим направлениям)

DECLARE 

 v_department egpl_department.department_name%type;

 cursor c_dept IS
  select department_name 
  into   v_department
  from   egpl_department 
  where  department_id in (select department_id from egpl_casemgmt_activity)
  order by department_name; 

BEGIN 

  OPEN c_dept;
  FETCH c_dept INTO v_department;
  CLOSE c_dept;

  -- do something with v_department

END;

Это поместит первое найденное в таблице значение в v_department. Используйте предложение ORDER BY, чтобы убедиться, что возвращаемая строка будет той, которая вам требуется, при условии, что существует вероятность 2 разных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...