PLS-00103: встречается символ «конец файла», ожидая одно из следующего:;

Вопрос:Я запускаю следующий script - 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: ; Лучший ответ: В инструкции выбора блока PL/SQL должно быть предложение into: DECLARE v_department egpl_department.department_name%type; BEGIN select department_name into v_department from

Вопрос:

Я запускаю следующий script –

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: ; Лучший ответ:

В инструкции выбора блока 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; Ответ №1

В 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-код.

Ответ №2

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

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

Ответ №3

Чтобы избежать проблемы с 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, чтобы убедиться, что возвращаемая строка будет той, которая вам нужна, при условии, что существует возможность двух разных значений.

Оцените статью
Добавить комментарий