SQL Plus: Создание и выполнение сценариев - Взаимодействие SQL*Plus с пользователем
ОГЛАВЛЕНИЕ
Взаимодействие SQL*Plus с пользователем
Стандартный механизм запроса значений пользовательских переменных дает ограниченные средства взаимодействия с пользователем - ввод значений в ответ на стандартные приглашения. Утилита SQL*Plus позволяет управлять выдачей сообщений и запросом значений переменных.
Команда PROMPT
Для выдачи на экран произвольного текста используется команда PROMPT со следующим синтаксисом:
- <команда PROMPT> ::=
- PRO[MPT] [<текст>]
Она выдает указанный текст или пустую строку (при вызове без параметров). Если необходимо выдать несколько строк, для каждой строки выполняется отдельная команда PROMPT.
Команда ACCEPT
Считать строку и запомнить ее в указанной пользовательской переменной определенного типа (выдавая, при необходимости, приглашение) позволяет команда ACCEPT со следующим синтаксисом:
- <команда ACCEPT> ::=
- ACC[EPT] <имя переменной> [<тип переменной>]
[FOR[MAT] <формат>] [DEF[AULT] <стандартное значение>]
[<приглашение>] [HIDE] - <тип переменной> ::=
- NUM[BER] / CHAR / DATE
- <приглашение> ::=
- PROMPT <текст> / NOPR[OMPT]
Если указанная в команде ACCEPT пользовательская переменная не существует, SQL*Plus создает ее. Опции команды ACCEPT описаны в табл. 14.
Таблица 14. Опции команды ACCEPT.
Опция | Назначение |
NUMBER | Задает переменной тип NUMBER. Если введенное значение не приводится к этому типу, команда ACCEPT выдает сообщение об ошибке и запрашивает значение снова. |
CHAR | Задает переменной тип CHAR. Длина строки-значения не должна превышать 240 байтов. |
DATE | Задает переменной тип DATE. Если введенное значение не преобразуется в тип DATE с учетом текущего формата даты в сеансе (NLS_DATE_FORMAT), команда ACCEPT выдает сообщение об ошибке и запрашивает значение снова. |
FORMAT | Явно задает формат, которому должно соответствовать введенное значение. Формат задается так же, как для команды COLUMN. Если значение не соответствует формату, команда ACCEPT выдает сообщение об ошибке и запрашивает значение снова. |
DEFAULT | Задает стандартное значение, если оно не будет введено. Стандартное значение должно соответствовать стандартному или указанному формату. |
PROMPT | Выдает на экран указанный текст перед ожиданием ввода значения переменной. |
NOPROMPT | Выдает перевод строки и ждет ввода значения, не выдавая приглашений. |
HIDE | Подавляет выдачу вводимого значения на экран по ходу ввода. |
Рассмотрим простой пример совместного использования команд PROMPT и ACCEPT. Пусть имеется командный файл splus1.sql со следующим содержимым:
REM splus1.sql - пример диалога с пользователем
prompt prompt Input department number (10, 20, 30)
accept dept_number number prompt 'Dept. #: '
select * from dept where deptno = &dept_number;
Вот что происходит при его выполнении:
SQL> @f:\usr\doc\orasdev\splus1
Input department number (10, 20, 30)
Dept. #: q
SP2-0425: "q" не является допустимым числом
Dept. #: 10
прежний 2: where deptno = &dept_number
новый 2: where deptno = 10
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
Команда PAUSE
Команда PAUSE позволяет дождаться подтверждения того, что пользователь прочитал сообщение на экране, выданное командой PROMPT. Для подтверждения необходимо нажать клавишу Enter, после чего выполнение сценария или сеанса SQL*Plus продолжится.
Команда PAUSE имеет следующий синтаксис:
- <команда PAUSE> ::=
- PAU[SE] [<текст>]
Эта команда выдает пустую строку, затем строку текста, если он указан, или еще одну пустую строку, и ждет подтверждения от пользователя. Ввод эта команда ожидает с терминала (при интерактивном запуске), даже если входной и выходной потоки перенаправлены. При работе в пакетном режиме для продолжения необходимо наличие новой строки в файле, откуда берется входной поток.
Рассмотрим простой пример. Изменим файл splus1.sql следующим образом:
set verify off
prompt Input department number (10, 20, 30)
accept dept_number number prompt 'Dept. #: '
pause Press Enter to view results
select * from dept where deptno = &dept_number;
Вот что будет выдано при его выполнении:
SQL> @f:\splus1
Input department number (10, 20, 30) Dept. #: 30
Press Enter to view results
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO
Для получения результатов пришлось нажать клавишу Enter после вывода соответствующего приглашения.