Oracle PLSQL: как использовать переменную подстановки на основе каждого значения?
Declare
v_test varchar2(30) := 'enter value for A';
v_temp;
Begin
v_temp := &v_test;
dbms_output.put_line('v_temp :='||v_temp);
end;
При выполнении вышеуказанного блока PLSQL для переменной подстановки &v_test вместо запроса значения Enter для v_test следует запросить значение внутри v_test. то есть он должен запросить "введите значение для A". Поэтому каждый раз, когда я изменяю значение v_test, это значение должно отображаться.
Есть ли решение для этого?
3 ответа
PL/SQL не является интерактивным языком, он предназначен для написания API, а не UI. Аналогично, SQL*Plus не имеет контрольных слов, таких как IF или ELSE, это не язык программирования.
Если вам нужен более умный пользовательский интерфейс для запуска вашего кода, вам следует использовать инструмент программирования пользовательского интерфейса. Поскольку вы используете SQL*Plus, ваши пользователи имеют доступ к ОС, поэтому сценарий оболочки или .bat
файл кажется лучшим вариантом. Кроме того, мы можем запускать веб-страницы прямо из базы данных, но это может быть немного чрезмерно, это зависит от сложности ваших требований.
Если ни одно из этих предложений не подходит, вы можете попробовать более подробную подсказку SQL*Plus:
ACCEPT v_test CHAR FORMAT 'A30'
PROMPT 'Enter the test you want to run: A , B or C :'
ACCEPT v_deptno NUMBER FORMAT '99'
PROMPT 'If you chose A please enter DEPT NO or skip:'
ACCEPT v_mgr CHAR FORMAT 'A30'
PROMPT 'If you chose B please enter MGR NAME or skip:'
ACCEPT v_stdt DATE FORMAT 'YYYY-MM-DD'
PROMPT 'If you chose C enter START DATE (YYYY-MM-DD) or skip:'
ACCEPT v_endt DATE FORMAT 'YYYY-MM-DD'
PROMPT 'If you chose C enter END DATE (YYYY-MM-DD) or skip:'
Теперь вы можете вставить эти переменные в анонимный блок, в котором есть управляющие слова IF и ELSE, необходимые для определения того, какие значения были представлены, и выполнения соответствующих действий.
Я согласен, что это неуклюжий и не очень прощающий, поэтому пользователи будут ненавидеть это; но, как я уже сказал, это не то, что эти инструменты действительно должны делать. Во всяком случае, узнать больше.
Вы можете использовать так:
Declare
v_temp varchar2(30);
Begin
v_temp := &enter_value_for_A;
dbms_output.put_line('v_temp :='||v_temp);
end;
Вы можете изменить свой код, как это,
Declare
v_temp varchar2(30) := &B;
Begin
dbms_output.put_line('v_temp :='||v_temp);
end;
/
Declare
v_temp varchar2(30) := &A;
Begin
dbms_output.put_line('v_temp :='||v_temp);
end;
/