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