it-roy-ru.com

PL/SQL: как мне ввести пользовательский ввод в процедуру?

Это вопрос о небольшой части большого проекта, который я делаю. Я попробовал следующее, но я просто получаю две ошибки ниже:

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE HELLO AS
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;
/

Ошибка (2,5): PLS-00103: Обнаружен символ «ОБЪЯВИТЬ» при ожидании одно из следующего: начало функция прагма тип процедуры подтип ток Удаление курсора существует до внешнего языка. Символ «начало» был вместо "ОБЪЯВИТЬ", чтобы продолжить.

Ошибка (10,8): PLS-00103: Обнаружен символ «конец файла», когда ожидание одного из следующих действий: (begin case объявлять end исключение выход для goto, если loop mod null pragma поднимает return select update в то время как 
<< продолжить закрыть текущий удалить извлечение блокировки
вставить открытый набор точек сохранения отката sql выполнить commit для полного слияния продувка труб

Нам дали отметку о том, как будет маркироваться наш код, и для этого раздела соответствующие критерии будут: «Использует ли сценарий процедуру?» и «Запрашивает ли скрипт правильное/неправильное и групповое/индивидуальное и правильно ли обрабатывает предоставленные данные?».

Краткие цитаты проекта «Разработать процедуру, которая запрашивает RIGHT/WRONG (используя &), затем обновляет таблицу» (где table - это имя таблицы 

Целью переменных было обновить существующий атрибут записи. то есть, если пользователь выбрал 1 и n, то обновите ноль в записи до 2. если это было 1 и y, то обновите до 1, а если 0 и y/n, то обновите до 0

3
user3120554

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

Этот фрагмент кода работает только в 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. В любом случае, как я уже говорил вам в последнем комментарии к вашему вопросу, это не взаимодействие с пользователем, а просто результат предварительной обработки оператора. Каждый раз, когда вы вводите разные значения, СУБД выполняет другой исходный код.

Вероятно, ваше требование использовать «процедуру» не подразумевало использование хранимой процедуры (что невозможно сделать), а просто предназначение сценария SQL * Plus, попросите пояснений.

1
Alessandro Rossi

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

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

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

1
David Aldridge

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

0
Jeremy