2015-09-13 2 views
1

Это вопрос о небольшой части большого проекта, который я делаю. Я попытался следующие, но я просто получить две ошибки под ним: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; 
/

Error (2,5): PLS-00103: Обнаружен символ «DECLARE» когда ожидается одно из следующих действий: начать функцию pragma procedure подтип типа текущий курсор удалить существует предшествующий внешний язык Символ «начало» был заменён на «DECLARE» для продолжения.

Error (10,8): PLS-00103: Обнаружен символ «конец файла», когда ожидает одно из следующих действий: (начать случай объявить торцевое исключение, выхода для Goto, если цикл мод нулевого обратной Прагмы рейза выберите обновление в то время как с
< < продолжает закрывать текущие удаления выборки блокировки
вставку открытого откатом набора точку сохранение SQL выполнить коммит FORALL слияния трубы Чистку

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

В рамках проекта краткие цитаты «Разработать процедуру, которая запрашивает правильно/неправильно (используя &), затем обновляет таблицу» (где таблица является имя таблицы

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

+0

PL/SQL не работает с пользовательскими взаимодействиями при работе на РСУБД, поэтому вы должны сначала получить параметры по-другому, а затем передать их в процедуру или анонимный блок посредством привязки. Пользовательские взаимодействия должны обрабатываться клиентом или архитектурой среднего уровня. –

+0

Еще одна вещь: символ & принимается только SQL * Plus, который предварительно обрабатывает оператор и выполняет необходимые замены перед отправкой кода с замещенными значениями в РСУБД. Попросите своих коллег помочь вам найти информацию об этом. Эта сторона серверного программирования может быть довольно уродливой, с которой сталкивается новичок. Имейте в виду, что после начала PL/SQL-блока нет простых способов взаимодействия, и всегда лучше избегать этого. –

ответ

1

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

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

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

+0

Я не совсем уверен, что делать. У меня есть требование использовать «процедуру». Ваше предложение, хотя и отлично, похоже, выходит за рамки моего обучения. Это важно, целью переменных было обновление существующего атрибута записи. т.е. если пользователь выбрал 1 и y, то обновить значение null в записи до 2. если это было 1 и n, то обновить до 1, объявление, если 0 и y/n, а затем обновить до 0 – user3120554

+0

. Вы просто не можете взаимодействовать с пользователем, чтобы запросить их , но вы можете принимать параметры как часть вызова процедуры, поэтому процедура будет вызываться как: hello (1, 'Y') –

0

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

+0

Я удалил объявление и запустил скрипт. Я получил сообщение о том, что он был скомпилирован, но имел ошибки: Ошибка (9,5): PL/SQL: Statement игнорируется. Ошибка (9,18): PLS-00201: идентификатор «Y» должен быть объявлен – user3120554

6

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) 
+0

Как-то это не сработало для меня, мне пришлось использовать 'exec HELLO (& p1, & p2)' в моем случае, иначе были проблемы со связыванием , –

1

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

+0

Благодарим вас за комментарий. Извиняясь за мою неопытность, я все еще изучаю PL/SQL. Это может быть причиной моего недоразумения. Нам была дана отметка о том, как будет выглядеть наш код, и для этого раздела соответствующие критерии будут следующими: «Использует ли сценарий процедуру?» и «Сканирует ли сценарий правильные/неправильные и команды/отдельные лица и правильно обрабатывает данные?». Краткие цитаты проекта «Разработайте процедуру, которая запрашивает RIGHT/WRONG (с использованием &), а затем обновляет таблицу» (где table - это имя таблицы, которую у меня есть) – user3120554

Смежные вопросы