2016-06-28 3 views
0

Привет всем Я новичок в PL/SQL, однако я нажимаю небольшой код, который подскажет пользователю ввести 2 номера и отобразить числа с помощью DBMS_output.Put_line , , но я получаю ошибку компиляции, ниже мой код, я использую "Oracle разработчик SQL"Вывод пользовательского ввода в PL/SQL с помощью разработчика SQL

SET SERVEROUTPUT ON SIZE 1000000;

DECLARE n_no_1 number(8,2); n_no_2 number(8,2); BEGIN

DBMS_output.put_line('Enter Value for no 1'); &n_no_1; DBMS_output.put_line('Enter value for no 2'); &n_no_2;

DBMS_OUTPUT.PUT_LINE('The value of No 1 is' || n_no_1);

DBMS_OUTPUT.PUT_LINE('The value of No 2 is' || n_no_2);

END;

/

ответ

0

Эти 2 линии ваша проблема, однако, не по причинам, указанным в другом ответе:

&n_no_1;

&n_no_2;

В SQL можно использовать амперсанд (&), чтобы вызвать что-то под названием «Макрозамещение».

Когда компилятор сталкивается с чем-то вроде этого (то есть &n_no1), он предлагает пользователю ввести значение для его замены в своем месте.

Итак, если вы введете «Привет». Ваш код будет выглядеть так:

DBMS_output.put_line('Enter Value for no 1'); 
Hello; 

И как вы можете видеть, что потерпит неудачу, если бы вы только что напечатали это.

То, что вы хотите сделать, это присвоить это значение переменной, например:

n_no_1 := '&n_no_1'; 

, который получает «заменить» этим:

n_no_1 := 'Hello'; 

, который компилирует - и работает - просто хорошо.

Что все сказано, это НЕ лучший способ сделать это, хотя это, кажется, учебное упражнение?

Посмотрите на PROMPT и ACCEPT ключевые слова ..вы можете использовать те, в SQL (за пределы BEGIN/END DECLARE/блока), чтобы захватить значения первыми в аккуратной моде :)

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve032.htm#SQPUG052

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve005.htm#SQPUG026

Найдены дополнительное звено здесь стоит хорошо читать , Объясняет намного больше, чем то, что вы смотрите, но обсуждает переменные подстановки и другие вещи (похожие и некоторые другие неродственные вещи :))

https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia

+0

компиляция теперь успешно. Я немного меняю код, но я не получаю его. этот код теперь 'SET SERVEROUTPUT ON SIZE 1000000; DECLARE n_number1 number (8,2): = & n_number1; Номер n_number2 (8,2): = & n_number2; BEGIN DBMS_OUTPUT.PUT_LINE (n_number1); DBMS_OUTPUT.PUT_LINE (n_number2); END; /' –

+0

Извините, но это неправильно с самого начала. «Макрозамещение» не «в SQL». Подстановка макросов - это особенность SQLPlus и других интерфейсов, основанных на нем, таких как SQL Developer. Подстановка выполняется до того, как SQL Developer отправляет текстовую строку (программу PL/SQL) интерпретатору («компилятор») для обработки. Ответ Матфея правильный, а ваш неверен. – mathguy

+0

@ditto это то, что я сделал до начала, и теперь работает 'n_number1 number (8,2): = & n_number1;' –

0

Синтаксис &variable не PL/SQL: она является частью SQL Developer. Я вижу, что вы пытаетесь сделать и синтаксические ошибки, но нет смысла исправлять их, потому что это не сработает в конце.

Причина: вы не можете принимать пользовательский ввод через PL/SQL во время выполнения.

+0

Я согласен с вами о '' & синтаксис не часть PL/SQL, но в этом уроке я вижу, что он получает доступ к пользовательскому вводу через разработчика sql, вы можете запустить первый код и посмотреть http://www.plsqltutorial.com/plsql-nested-block/ –

+0

«Причина : вы не можете принимать пользовательский ввод через PL/SQL ». извините, это не совсем так. Подстановка макросов позволяет вам «принимать пользовательский ввод через PL/SQL» просто отлично. Это некрасиво, но это позволяет вам. – Ditto

+0

Они используют синтаксис '&' своего клиента (например, SQL Developer) для сбора и установки значения _at compile time_. В вашем примере, похоже, вы пытаетесь собрать пользовательский ввод _at runtime_. В анонимном блоке PL/SQL время компиляции и время выполнения могут быть очень близки друг к другу, но разница _is_. –