Мое тестирование выработало те же результаты, что и Prine, однако я подумал об довольно простом обходном пути:
Используя BufferedReader#nextLine()
, где вы Scanner#readLine()
, избегаете этой ошибки. Возможно, вы даже можете написать свою собственную оболочку сканера, чтобы переопределить функцию readLine Scanner с помощью функции nextLine BufferedReader.
Этот фрагмент кода работает только в SQL * Plus и не может использоваться для создания хранимой процедуры !!!
DECLARE
variable1 NUMBER(1);
variable2 CHAR(1);
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
variable1 := &please_enter_1_or_0;
variable2 := '&please_enter_y_or_n';
END;
Обратите внимание на разницу в последнем утверждении, где последняя переменная замещения цитируется в строке, которая должна быть правильно принята синтаксисом PL / SQL. В любом случае, как я сказал вам в последнем комментарии к вашему вопросу, это не взаимодействие с пользователем, а только результат предварительной обработки заявления. Каждый раз, когда вы вводите разные значения, RDBMS выполняет другой исходный код.
Вероятно, ваше требование использовать «процедуру» не предназначено для использования процедуры STORED (это невозможно сделать), но они просто предназначен сценарий SQL * Plus, попросите разъяснения.
PL / SQL - это язык для написания автономных программ. Он не предназначен для интерактивности пользователя. Входные значения передаются как параметры. Поэтому ваша программа должна выглядеть так:
CREATE OR REPLACE PROCEDURE HELLO
(p1 in number
, p2 in varchar2)
AS
l_salutation varchar2(20) := 'Hello World';
BEGIN
DBMS_OUTPUT.PUT_LINE(l_salutation);
DBMS_OUTPUT.PUT_LINE('p1 = ' || p1);
DBMS_OUTPUT.PUT_LINE('p2 = ' || p2);
END;
/
Обратите внимание: нет необходимости в DECLARE с именованной процедурой. Раздел между AS и BEGIN предназначен для объявления переменных, как это было сделано с l_salutation
.
Вы можете указать значения этих параметров при вызове программы. В SQL * Plus он будет работать следующим образом:
SET SERVEROUTPUT ON
accept p1 prompt "please enter 1 or 0: "
accept p2 prompt "please enter Y or N: "
exec HELLO (:p1, :p2)
Вы не можете напрямую получать сообщения от клиента в процедуре или пакете PL / SQL.
Лучшее, что вы можете сделать, чтобы эмулировать это, - это взаимодействие с табличными данными и возможность вставлять данные в таблицу и реагировать на это, или использовать расширенную очередь (это примерно одно и то же).
В качестве альтернативы, принимайте вход пользователя как параметры при вызове процедуры.
Вы можете просто удалить объявление, чтобы исправить ошибку ora