Показывать вывод до и после этого запроса для ввода в PL / SQL [дубликат]

Мое тестирование выработало те же результаты, что и Prine, однако я подумал об довольно простом обходном пути:

Используя BufferedReader#nextLine(), где вы Scanner#readLine(), избегаете этой ошибки. Возможно, вы даже можете написать свою собственную оболочку сканера, чтобы переопределить функцию readLine Scanner с помощью функции nextLine BufferedReader.

3
задан user3120554 13 September 2015 в 16:11
поделиться

4 ответа

Этот фрагмент кода работает только в 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, попросите разъяснения.

1
ответ дан Alessandro Rossi 26 August 2018 в 01:15
поделиться

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)
6
ответ дан APC 26 August 2018 в 01:15
поделиться

Вы не можете напрямую получать сообщения от клиента в процедуре или пакете PL / SQL.

Лучшее, что вы можете сделать, чтобы эмулировать это, - это взаимодействие с табличными данными и возможность вставлять данные в таблицу и реагировать на это, или использовать расширенную очередь (это примерно одно и то же).

В качестве альтернативы, принимайте вход пользователя как параметры при вызове процедуры.

1
ответ дан David Aldridge 26 August 2018 в 01:15
поделиться

Вы можете просто удалить объявление, чтобы исправить ошибку ora

0
ответ дан Jeremy 26 August 2018 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: