Для работы в SQL*Plus, как для выполнения простых команд, так и для разработки сценариев по сбору информации из базы данных, необходимо уметь пользоваться командами SQL*Plus двух основных видов. К первому относятся команды, которые на самом деле что-то делают и потому могут называться рабочими (как, например,
, которая выполняет восстановление базы данных), а ко второму — команды, которые позволяют получать удобный для прочтения вывод от запросов и потому называются командами форматирования.RECOVER
В настоящей статье вы ознакомитесь с важнейшими представителями обоих этих видов команд. В частности, в этом разделе рассматриваются команды, которые что-то делают, а в следующем — те, что позволяют форматировать вывод и получать отчеты.
Команда SQLPROMPT
Администратору баз данных обычно приходится иметь дело с несколькими базами данных. Из-за этого при выполнении множества задач на протяжении дня очень легко забыть, к какой базе данных подключен тот или иной сеанс SQL*Plus. Поэтому во избежание допущения грубых ошибок (вроде удаления производственных таблиц вместо разрабатываемых или тестируемых), следует всегда настраивать среду так, чтобы имя экземпляра базы данных постоянно отображалось в приглашении, напоминая о том, с какой базой данных происходит взаимодействие.
Для настройки приглашения SQL*Plus так, чтобы в нем отображалось имя базы данных, служит приведенная ниже команда, в которой используется специальная предопределенная переменная _CONNECT_IDENTIFIER
(предопределенные переменные подробно рассматриваются в разделе “Предопределенные переменные SQL*Plus” далее в главе):
SQL> SET SQLPROMPT '_CONNECT_IDENTIFIER > ' nick >
Обратите внимание, что команда SET
приводит к немедленному изменению приглашения в интерфейсе SQL*Plus. После выдачи этой команды приглашение приобретает более значимый вид, ясно указывающий на то, с какой базой данных происходит взаимодействие, и избавляет от необходимости делать по этому поводу какие-либо предположения. В данном примере оно указывает на то, что в текущий момент подключение установлено с базой данных nick
.
Для настройки приглашения SQL*Plus можно также использовать и другие специальные предопределенные переменные. Например, с помощью переменной _USER
в приглашении отображается имя пользователя:
SQL> SET SQLPROMPT "_USER > " APPOWNER >
Применив одновременно переменные _USER
и _CONNECT_IDENTIFIER
, можно сделать так, чтобы в приглашении отображалось и имя базы данных, и имя текущего пользователя:
SQL> SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER > " APPOWNER@nick >
Используя переменные _USER
и _PRIVILEGE
, в приглашении можно отображать не только имя текущего пользователя, но и привилегии, которыми он обладает:
SQL> SET SQLPROMPT "_USER _PRIVILEGE> " SYS AS SYSDBA>
С помощью переменных _USER
, _DATE
и _CONNECT_IDENTIFIER
в приглашении можно отобразить имя пользователя, текущую дату и имя базы данных:
SQL> SET SQLPROMPT "_USER 'on' _DATE 'at' _CONNECT_IDENTIFIER > " SYS on 20-JUN-09 at nick>
При желании строку, вроде показанной выше, легко добавить в файл login.sql
,чтобы желаемые значения устанавливались автоматически при каждом входе в систему, и их не приходилось настраивать вручную.
Команда DESCRIBE
Команда DESCRIBE
описывает или выводит список столбцов таблицы вместе с их спецификациями. Кроме того, она позволяет получать описание процедур или пакетов Oracle. Эта команда чрезвычайно полезна при выполнении рутинных обязанностей администратора баз данных. Если, например, нет уверенности в том, какой столбец нужно выбрать в определенной таблице, но точно известно, к какой именно таблице следует выполнить запрос, с помощью команды DESCRIBE
можно получить список всех столбцов, которые имеются в данной таблице. Поскольку команда DESCRIBE
может применяться даже в отношении метаданных (словаря данных), с ее помощью можно также очень легко знакомиться с информацией о таблицах и столбцах и их применении, которая является критически важной для работы с базой данных.
В листинге ниже показано, как команда DESCRIBE
позволяет отображать столбцы и типы столбцов таблицы.
SQL> DESCRIBE employees Name Null? Type ---------------------- -------- --------------------- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4) SQL>
Команда HOST
Команда HOST
позволяет выполнять в SQL*Plus команды операционной системы.Например, может возникнуть необходимость посмотреть, существует ли некий файл в определенном каталоге, или выдать команды cp
или tar
на уровне UNIX
, а затем вернуться в сеанс SQL*Plus и возобновить взаимодействие с базой данных Oracle.
Ниже приведен пример применения команды HOST
:
SQL> HOST cp /u01/app/oracle/new.sql /tmp
В этом примере команда HOST
помогает скопировать файл new.sql
из указанного каталога в каталог tmp
.
С помощью команды HOST
можно выполнять практически все те же команды, которые доступны на уровне операционной системы. Слово HOST
можно заменять восклицательным знаком (!):
SQL> ! cp /u01/app/oracle/new.sql /tmp
На заметку! В случае ввода команды HOST без параметров вы попадаете в каталог операционной системы, из которого изначально запускали сеанс SQL*Plus.
По завершении работы с операционной системой достаточно ввести в командной строке exit
и на экране снова появится приглашение покинутого ранее сеанса SQL*Plus.
Например:
SQL> HOST $ exit SQL>
Команда SPOOL
Команда SPOOL
позволяет сохранять вывод одного и более SQL-операторов в файлах операционной системы, как в UNIX, так и в Windows:
SQL> SET LINESIZE 180 SQL> SPOOL employee.lst SQL> SELECT emp_id, last_name, salary, manager FROM employee; SQL> SPOOL OFF;
По умолчанию создаваемые этой командой буферные (spooled) текстовые файлы сохраняются как имя_файла.lst
. Хотя по умолчанию принято сохранять вывод в файле,его также можно отправлять и на принтер. Буферизация файлов является очень полезным приемом при использовании SQL для оказания помощи в написании SQL-сценариев, и некоторые примеры его применения можно найти в приложении.
С помощью команды SPOOL
можно добавлять данные в существующий буферный файл, а также полностью заменять его (по умолчанию происходит замена). Ниже приведен весь синтаксис этой команды:
SPOOL { имя_файла[.расширение] [CRE[ATE]|REP[LACE]|APP[END]]| OFF | OUT }
Ниже описаны параметры команды SPOOL
.
имя_файла
. Специфицирует имя буферного файла. Расширение может выглядеть по-разному, но в большинстве случаев используется предлагаемое по умолчанию расширение .lst.CREATE
. Указывает, что требуется создать новый файл.REPLACE
. Указывает на необходимость замены содержимого существующего файла или создания нового файла, если он не существует. Это поведение по умолчанию.APPEND
. Указывает на необходимость добавить содержимое буфера в конец указанного файла.OFF
. Указывает, что требуется остановить процесс буферизации.OUT
: Указывает, что требуется остановить процесс буферизации и отправить файл на принтер по умолчанию. В некоторых операционных системах этот параметр не поддерживается.
У команды SPOOL
имеет множество способов применения. Например, она легко экспортируется для перехвата результатов оператора SELECT
. Перед этим, однако, должен обязательно задаваться формат вывода путем определения значений для переменных HEADING, FEEDBACK
и LINESIZE
. Ниже приведен пример:
SQL> SPOOL /u01/app/oracle/data/employees.txt; SQL> SELECT * FROM hr.employees; SQL> SPOOL OFF;
В этом примере файл employees.txt
служит для перехвата всех данных из таблицы HR.EMPLOYEES
. Далее его можно будет использовать для загрузки данных в другую таблицу с помощью утилиты SQL*Loader.
Команды ACCEPT и PROMPT
Команда ACCEPT
применяется для считывания вводимых пользователем данных с экрана и сохранения их в какой-то переменной. Эту переменную можно либо указать самостоятельно, либо позволить создавать ее SQL*Plus. Обычно команда ACCEPT
применяется для считывания данных, вводимых пользователем в ответ на приглашения в интерфейсе SQL*Plus.
Что касается команды PROMPT
, то она полезна при создании интерактивных сценариев. Она умеет отправлять от SQL*Plus на экран сообщение или просто пустую строку,и обычно применяется для получения входных данных от пользователя или вывода комментариев. Например, включение в сценарий строки PROMPT
"Тестирование
" приведет к получению следующего вывода:
SQL> "Тестирование"
Команды ACCEPT
и PROMPT
в SQL-сценарии обычно используются вместе и служат,как правило, для запроса у пользователя входных данных и сохранения этих данных в переменных для дальнейшей работы с ними в программе. Ниже приведен пример, иллюстрирующий использование этих команд:
SQL> PROMPT 'Пожалуйста, введите свою фамилию' SQL> ACCEPT lastname CHAR FORMAT a20 alapati
Команда EXECUTE
При использовании сценариев, которые вызывают PL/SQL-код в форме процедур и пакетов, для фактического запуска отдельных процедур в пакете необходимо применять команду EXECUTE
. Ниже приведен пример:
SQL> EXECUTE add_data PL/SQL procedure successfully completed SQL>
Обратите внимание, что для выполнения процедуры или функции можно специфицировать как ключевое слово EXECUTE
, так и ключевое слово EXEC
.
Команда PAUSE
Часто бывает так, что сценарии при выполнении генерируют вывод, который не умещается на экране. Этот вывод быстро пролетает перед глазами на экране и исчезает до того, как его удается прочитать. Разумеется, можно воспользоваться командой SPOOL
для перехвата всего вывода целиком, но делать так постоянно не выгодно, поскольку тогда придется тратить на создание и прочтение файлов с выводом сценариев целый день. Поэтому лучше использовать другую предлагаемую в SQL*Plus команду, а именно — PAUSE
, которая позволяет приостанавливаться после отображения каждого целого экрана вывода. Переход к следующему экрану вывода осуществляется просто нажатием клавиши <Enter>.
Приведенный ниже пример демонстрирует использование команды PAUSE
для замедления отображения вывода на экране терминала:
SQL> SHOW PAUSE PAUSE is OFF SQL> SET PAUSE ON SQL> SHOW PAUSE PAUSE is ON and set to ""
После настройки команды PAUSE
вывод больше не будет быстро проскакивать на экране при каждом выполнении SQL-команды. Вместо этого SQL*Plus будет отображать один экран вывода, и ожидать нажатия клавиши <Enter>. При запуске запросов с командой PAUSE
для просмотра первого экрана вывода тоже необходимо нажимать клавишу <Enter>.