|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2004 г
Утилита SQL*Plus. Создание и выполнение сценариевВ. Кравчук, OpenXS InitiativeОглавлениеНазначение SQL*PlusЗапуск SQL*Plus и выход из него Подключение к стандартной и удаленной базе данных Основные команды Команды для работы с файлами Параметры командных файлов Связываемые переменные Трассировка операторов Настройка среды SQL*Plus Команды администрирования базы данных Дополнительные источники информации Упражнения Назначение SQL*PlusУтилита SQL*Plus позволяет выполнять команды SQL и блоки PL/SQL, а также решать ряд других задач. С помощью SQL*Plus можно:
Базовые понятияПри работе с SQL*Plus используются следующие базовые понятия:
Расширенные формулы Бэкуса-НаураПри описании синтаксиса команд SQL*Plus использованы расширенные формулы Бэкуса- Наура (БНФ). Расширенные БНФ являются способом сокращенной записи контекстно- свободных грамматик. Нетерминальные символы (определяемые понятия, конструкции и команды SQL*Plus) взяты в угловые скобки. Терминальные символы выделены жирным шрифтом. Учтите, что команды SQL*Plus не зависят от регистра терминальных символов. Метасимвол ::= означает "по определению есть". Метасимвол | обозначает, что данная формула является сокращенной записью нескольких формул с одинаковыми левыми частями и различными цепочками в правой части (т.е. возможен один из разделенных этим символом вариантов). Пара метасимволов [ ] используется для обозначения того, что находящаяся между ними цепочка может содержаться, а может и не содержаться в правой части формулы. Пара метасимволов { } означает, что содержащаяся между ними цепочка может повторяться ноль или более раз. Приоритет метасимвола | выше, чем у пар [ ] и { }. Немного подробнее о расширенных БНФ можно прочитать здесь. Запуск SQL*Plus и выход из негоДля запуска утилиты SQL*Plus используется команда операционной системы, обычно - sqlplus. Запуск выполняется из командного интерпретатора или окна командной строки. В версиях для операционных систем Microsoft использовались другие имена команды для вызова SQL*Plus, например, sqlplus30. В настоящее время (начиная с версии 8.1.5) в этих операционных системах имеется две версии этой утилиты: sqlplus, работающая в окне командной строки, и оконная версия, sqlplusw. Общий синтаксис вызова SQL*Plus имеет вид:
Опции командной строкиКак следует из синтаксиса, при вызове SQL*Plus можно указать ряд опций. Они кратко описаны в табл. 1. Таблица 1. Опции командной строки утилиты SQL*Plus.
Таблица 2. Команды, отключаемые уровнями ограничения.
Регистрационная информацияПри запуске SQL*Plus необходимо ввести регистрационную информацию. Если эта информация не указана, но указан начальный сценарий, предполагается, что регистрационная информация указана в первой строке сценария. Если регистрационная информация не указана ни в командной строке, ни в начальном сценарии, SQL*Plus запросит ее. Если указано имя пользователя и не указан пароль, SQL*Plus запросит только пароль. При установке опции SILENT, приглашения для ввода имени пользователя и пароля не выдаются, введенное имя пользователя отображается, а пароль, как обычно, нет. Если вместо имени пользователя и пароля указана косая (/), предполагается стандартная регистрация от имени пользователя операционной системы (аутентификация операционной системой). При этом нельзя указывать строку связи. Cервер регистрирует пользователя OPS$name, где name - регистрационное имя текущего пользователя операционной системы. Префикс "OPS$" можно заменить любым другим с помощью соответствующего параметра инициализации сервера (OS_AUTHENT_PREFIX). Назначение роли позволяет получить привилегированное подключение пользователям, имеющим системные привилегии SYSOPER или SYSDBA. Такое привилегированное подключение можно получить и при запуске с опциями / или /NOLOG. При указании роли пользователя во многих операционных системах (например, в NT) необходимо взять все аргументы команды в кавычки: SQLPLUS "/ AS SYSDBA" SQLPLUS "SYSTEM/MANAGER AS SYSOPER" Опция /NOLOG позволяет запустить утилиту SQL*Plus без регистрации. Прежде, чем выполнять любые SQL-операторы, придется выполнить команду CONNECT для подключения. Эта опция обычно используется при запуске сценариев, явно подключающихся к базе данных с помощью команды CONNECT. Начальный сценарийПри запуске можно выполнить начальный сценарий (файл с командами SQL*Plus, операторами SQL и анонимными PL/SQL-блоками) и передать ему аргументы. Этот файл может находиться в локальной файловой системе или (только в версии 9.0.1 для Windows) на Web-сервере. Начальный сценарий запускается так же, как если бы он был передан в качестве аргумента команде START. Если для начального сценария не указан суффикс в имени файла, используется суффикс. заданный командой SET SUFFIX (по умолчанию, .sql). Использование профилей сайта и пользователяУтилита SQL*Plus поддерживает использование профиля сайта - командного файла, создаваемого администратором базы даных и автоматически выполняемого при регистрации любого пользователя. Этот файл обычно называется glogin.sql и находится в каталоге $ORACLE_HOME/sqlplus/admin.
Утилита SQL*Plus поддерживает также использование профиля пользователя - командного файла, выполняемого автоматически при регистрации пользователя после профиля сайта. Утилита SQL*Plus ищет файл профиля, login.sql, в текущем каталоге или, если не находит его там, в каталогах поиска файлов SQL-сценариев, задаваемых обычно переменной среды SQLPATH. В случае неудачной регистрации (после трехкратного запроса имени пользователя и пароля), утилита SQL*Plus завершает работу с кодом возврата, аналогичным получаемому по команде EXIT FAILURE. Выход из SQL*PlusДля выхода из SQL*Plus необходимо ввести команду EXIT. Будет выдана информация о версии сервера, к которому была подключена утилита, и о версии SQL*Plus. Затем работа программы завершается и либо закрывается окно, либо вы получаете приглашение командной строки операционной системы. Команда EXIT имеет следующий синтаксис:
По умолчанию при выполнении команды EXIT SQL*Plus фиксирует текущую транзакцию и завершает работу с кодом возврата 0 (SUCCESS). Подключение к стандартной и удаленной базе данныхДля доступа к данным необходимо сначала подключиться к базе данных. При запуске SQL*Plus обычно происходит подключение к стандартной базе данных с указанным именем пользователя и паролем. После запуска и успешной регистрации можно в любой момент подключиться к схеме другого пользователя или к другой базе данных. Для этого используется команда CONNECT. Стандартная база данных конфигурируется на уровне операционной системы, путем установки переменной среды или редактирования файла конфигурации Oracle. Использование команды CONNECTКоманда CONNECT имеет следующий синтаксис:
Информация о пользователе и базе данных, к которым необходимо подключиться, вводится в том же формате, что и при запуске (см. синтаксис вызова утилиты SQL*Plus выше). При подключении, как и при запуске, можно указать роль пользователя, от имени которого оно выполняется. Если пароль пользователя устарел, при подключении придется ввести новый пароль. Если же учетная запись заблокирована, то выдается сообщение об этом и подключение не происходит, пока администратор не разблокирует учетную запись. В случае если подключение по любой причине не удалось, вы остаетесь отключенными от базы данных, о чем будет сообщено. Можно также явно отключиться от схемы текущего пользователя с помощью команды DISCONNECT. Базы данных на других компьютерах или просто отличающиеся от стандартной называются удаленными. К удаленной базе данных можно подключиться, если для нее сконфигурированы сетевые службы Oracle Net и драйверы сетевых служб удаленной базы данных и локального клиента SQL*Plus совместимы. Формат строки связи для удаленной базы данныхК удаленной базе данных можно подключиться двумя способами:
В обоих случаях необходимо указать строку связи, задающую сетевую службу, к которой необходимо подключиться. Формат строки связи зависит от версии сетевых служб Oracle на машине, с которой выполняется подключение. При использовании Net8 обычно строка связи соответствует имени сетевой службы из файла tnsnames.ora, находящегося (в версиях 8.1.x и выше) в каталоге $ORACLE_HOME/network/admin/. Пусть в файле tnsnames.ora имеется следующая запись для сетевой службы Oracle:
TRAINING =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = creator)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = training)
)
)
Тогда для подключения к соответствующей базе данных при запуске SQL*Plus необходимо ввести, например, следующую команду в окне командной строки операционной системы: sqlplus scott/tiger@training Для подключения к соответствующей базе данных из SQL*Plus необходимо выполнить команду вида: CONNECT scott/tiger@training Основные командыПосле запуска утилита SQL*Plus выдает приглашение командной строки (обычно, это строка "SQL> "), после которого можно вводить команды. Команды состоят из одного или нескольких слов, разделенных произвольным количеством пробелов и/или символов табуляции. Регистр символов в командах обычно не имеет значения. При нажатии клавиши Enter команда (при выполнении определенных условий по ее завершению) выполняется. После выполнения команды снова выдается приглашение. Некоторые команды, например, блоки PL/SQL, могут занимать несколько строк. Тогда SQL*Plus выдает дополнительные приглашения с номером строки, например, "2> ". В командной строке SQL*Plus можно вводить команды трех видов:
От вида команды зависит способ продолжения ее на следующей строке, завершения и выполнения. Выполнение командБуфер SQLПоследнюю введенную команду (SQL-оператор или блок PL/SQL) SQL*Plus хранит в области, которая называется буфер SQL. Оператор или блок остается в этом буфере пока не будет введен новый. В буфер SQL не попадает точка с запятой или косая, завершающая оператор или блок, соответственно. Содержимое буфера SQL можно редактировать и выполнять повторно. Для повторного выполнения содержимого буфера SQL используется команда RUN или косая черта (/). Команда RUN выдает содержимое буфера в стандартный выходной поток, а затем выполняет. Косая черта вызывает просто выполнение команды из буфера. Выполнение операторов SQLОператор SQL можно завершить тремя способами:
Точка с запятой в конце строки означает выполнение оператора. Утилита SQL*Plus выполняет оператор и запоминает его в буфере SQL. Этот символ является признаком завершения команды и после него нельзя вводить комментарий. Косая черта в качестве первого и единственного символа очередной строки означает, что оператор надо выполнить. Утилита SQL*Plus выполняет оператор и запоминает его в буфере SQL. Пустая строка в операторе SQL или сценарии SQL*Plus обычно означает, что ввод команды завершен, но выполнять ее пока не надо (это поведение можно изменить с помощью команды SQL*Plus SET SQLBLANKLINES). Команда помещается в буфер SQL и остается там, пока не будет введена другая команда. Выполнение блоков PL/SQLДля ввода блоков PL/SQL необходимо работать в режиме PL/SQL. Утилита SQL*Plus переходит в это режим, если:
Утилита SQL*Plus обрабатывает блоки PL/SQL так же, как и операторы SQL, за исключением точки с запятой и пустой строки. В режиме PL/SQL их ввод не вызывает выполнения или завершения команды. Чтобы завершить и выполнить блок PL/SQL, необходимо ввести строку с единственным символом - косой чертой (/). Чтобы завершить ввод блока и просто поместить его в буфер SQL, не выполняя, введите строку с единственным символом точка (.). Выполнение команд SQL*PlusКоманды SQL*Plus выполняются сразу и в буфер SQL не попадают. Завершать команды SQL*Plus точкой с запятой можно, но не обязательно. Большинство команд SQL*Plus можно сокращать до одной или нескольких первых букв, достаточных для однозначного определения команды. Если необходимо ввести длинную команду SQL*Plus, ее можно перенести на следующую строку. Для этого в конце строки необходимо ввести дефис (-) и только затем нажать клавишу Enter. Будет выдано приглашение, и ввод команды можно будет продолжить. Точно так же интерпретируется дефис и в операторах SQL - если это последний не пробельный символ в строке, он не попадет в буфер и считается просто признаком продолжения команды на следующей строке. Прекращение команды по ходу работыДля прекращения долго выполняющейся команды по ходу работы, необходимо ввести символ прерывания, обычно, Ctrl+C. При этом SQL*Plus прекратит выдачу результатов команды и выдаст приглашение. Прекратить таким способом команду, выдающую результаты в файл с помощью команды SPOOL, нельзя. Придется прекратить работу утилиты SQL*Plus, в которой была выдана команда, средствами операционной системы. Получение информации о времени выполнения командыДля сбора и выдачи данных о вычислительных ресурсах, использованных для выполнения одной или нескольких команд или блоков, предназначена команда TIMING. Она имеет следующий синтаксис:
Назначение команд таймера описано в табл. 3. Таблица 3. Команды таймера SQL*Plus.
Команда TIMING без параметров выдает количество активных таймеров. Рассмотрим пример использования команды TIMING:
SQL> timing start first
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> timing show
таймер для: first
Затрач.время: 00:00:16.74
SQL> timing stop
таймер для: first
Затрач.время: 00:00:21.20
SQL>
Для удаления всех таймеров используется команда CLEAR TIMING. Можно также автоматически выдавать время работы каждой команды помощью установки SET AUTOTRACE. Подробнее см. далее в разделе "Настройка среды SQL*Plus". Выполнение команд базовой операционной системыИз командной строки SQL*Plus можно выполнять любые команды базовой операционной системы. Для этого используется команда HOST, за которой идет командная строка для операционной системы. Команду HOST можно сокращать до первых двух букв. Если команда введена без параметров, открывается сеанс стандартного командного интерпретатора операционной системы. В нем можно выполнять любое количество команд. Для выхода из командного интерпретатора UNIX достаточно выполнить команду EXIT или ввести Ctrl+D. Доступ к команде HOST можно запретить, запуская утилиту SQL*Plus с любым уровнем ограничения. Получение оперативной справкиУтилита SQL*Plus позволяет получить справочную информацию по своим командам, а также основным объектам схем. Команда HELPДля получения справки по командам SQL*Plus используется команда HELP. Она может вызываться с одним необязательным аргументом. Если аргумент не указан, выдается справка по справочной системе SQL*Plus. Если аргумент указан, то выдается справка по всем командам SQL*Plus, начинающимся с указанного аргумента. Например, команда HELP EX выдает сначала справку по команде EXECUTE, а затем - по команде EXIT. Команда HELP INDEX выдает список всех команд SQL*Plus. Команда HELP TOPICS выдает список команд вместе с однострочным описанием назначения. Команда DESCRIBEКоманда DESCRIBE позволяет получить описание таблицы или представления, а также спецификацию типа, пакета, функции или процедуры:
Описание таблицы, представления или синонима содержит следующую информацию:
Например: SQL> desc emp Имя Пусто? Тип ----------------------------------------- -------- -------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) Команда DESCRIBE позволяет описывать объекты рекурсивно, причем глубина задается командой SET DESCRIBE. Можно также выдавать номер строки и сдвигать имя столбца или атрибута, если объект содержит несколько объектных типов. Длину выдаваемой строки описания можно контролировать с помощью команды SET LINESIZE. Описание функций и процедур содержит следующую информацию:
Например: PROCEDURE sys.subptxt Имя Аргумента Тип В/Из По-умолч ------------------------------ ----------------------- ------ -------- NAME VARCHAR2 IN SUBNAME VARCHAR2 IN USR VARCHAR2 IN TXT VARCHAR2 IN/OUT Редактирование командКоманды SQL*Plus не попадают в буфер, поэтому редактировать их можно только по ходу ввода с помощью клавиши Backspace. Утилита SQL*Plus поддерживает несколько команд редактирования текста в буфере. Они представлены в табл. 4. Таблица 4. Команды редактирования SQL*Plus.
Рассмотрим пример:
SQL> select ename, salary from emp;
select ename, salary from emp
*
ошибка в строке 1:
ORA-00904: неверно имя столбца
SQL> c /salary/sal
1* select ename, sal from emp
SQL> i where deptno=30;
SQL> /
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
BLAKE 2850
TURNER 1500
JAMES 950
6 строк выбрано.
SQL> list
1 select ename, sal from emp
2* where deptno=30
Форматирование результатов запросовРезультаты запросов в SQL*Plus можно дополнительно сформатировать. Утилита SQL*Plus позволяет управлять форматом столбцов, количеством строк на странице и дополнительными пустыми строками, заголовками страниц и т.д. В следующих разделах подробно рассмотрены наиболее часто используемые команды форматирования. Их применяют, если стандартный формат представления столбцов не подходит. Стандартный формат столбцовШирина числовых столбцов соответствует максимуму из ширины заголовка столбца, ширины, заданной с помощью опции COLUMN FORMAT, плюс один символ для знака, и ширины, заданной командой SET NUMWIDTH (по умолчанию, 10 символов). Если количество значащих цифр в числе больше, чем допускается шириной числового столбца, утилита SQL*Plus округляет число. Для столбцов других типов ширина столбца соответствует его ширине в базе данных. Все эти столбцы по умолчанию выравниваются влево. Для столбцов типа DATE формат определяется соответствующими NLS-параметрами. Если они не заданы, предполагается формат A9 (см. табл. 6). Команда COLUMNКоманда COLUMN для управления форматом выдачи столбца имеет следующий синтаксис:
Назначение опций форматирования столбца кратко описано в табл. 5. Таблица 5. Основные опции команды COLUMN.
Таблица 6. Основные элементы формата опции FORMAT.
Рассмотрим простой пример использования команды COLUMN для форматирования значений и заголовков столбцов:
SQL> col sal format 9,999.99
SQL> select sal, ename from emp;
SAL ENAME
--------- ----------
800.00 SMITH
1,600.00 ALLEN
1,250.00 WARD
2,975.00 JONES
1,250.00 MARTIN
2,850.00 BLAKE
2,450.00 CLARK
3,000.00 SCOTT
5,000.00 KING
1,500.00 TURNER
1,100.00 ADAMS
950.00 JAMES
3,000.00 FORD
1,300.00 MILLER
14 строк выбрано.
SQL> col sal clear
SQL> col ename heading "Зарплата|товарища"
SQL> a where deptno=30
1* select sal, ename from empwhere deptno=30
SQL> /
select sal, ename from empwhere deptno=30
*
ошибка в строке 1:
ORA-00933: неверное завершение SQL-предложения
SQL> c/where/ where/
1* select sal, ename from emp where deptno=30
SQL> /
Зарплата
SAL товарища
---------- ----------
1600 ALLEN
1250 WARD
1250 MARTIN
2850 BLAKE
1500 TURNER
950 JAMES
6 строк выбрано.
Команда COLUMN с единственным параметром - ссылкой на столбец, выдает все атрибуты форматирования указанного столбца. Команда COLUMN без параметров выдает все атрибуты форматирования для всех столбцов, для которых они явно устанавливались. Продолжая предыдущий пример: SQL> col ename COLUMN ename ON HEADING 'Зарплата|товарища' headsep '|' Команда BREAKКоманда BREAK позволяет разбить выдаваемые строки на группы по значению столбца, разделяя группы пустыми строками, а также управлять выдачей дублирующихся значений и значений, подсчитанных с помощью команды COMPUTE. Она имеет следующий синтаксис:
Команда BREAK без параметров выдает свои текущие параметры (параметры разрыва). Каждый последующий вызов BREAK с параметрами отменяет предыдущий. Для отмены параметров разрыва используется команда CLEAR BREAKS. Назначение опций команды BREAK описано в табл. 7. Таблица 7. Основные варианты вызова команды BREAK.
Конструкцию ON <столбец> можно задавать в одной команде BREAK несколько раз. При этом столбцы проверяются в порядке указания. Действия же выполняются в обратном порядке, от самого внутреннего разрыва. Если при вводе необходимо перенести опции на следующую строку, укажите дефис (-) в конце первой строки. Обычно команда используется с операторами SELECT, содержащими конструкцию ORDER BY. Рассмотрим пример (обратите внимание на пустые строки):
SQL> break on deptno skip on sal skip 1
SQL> break
break on deptno пропустить 1 nodup
on sal пропустить 1 nodup
SQL> select deptno, ename, sal from emp order by deptno;
DEPTNO ENAME SAL
---------- ---------- ----------
10 CLARK 2450
KING 5000
MILLER 1300
20 SMITH 800
ADAMS 1100
FORD 3000
SCOTT
JONES 2975
30 ALLEN 1600
BLAKE 2850
MARTIN 1250
JAMES 950
DEPTNO ENAME SAL
---------- ---------- ----------
30 TURNER 1500
WARD 1250
14 строк выбрано.
Команда COMPUTEКоманда COMPUTE позволяет вычислять и выдавать итоговые значения. При вызове без параметров выдает все заданные вычисления. Команда COMPUTE имеет следующий синтаксис:
Функции, которые можно использовать при вычислении в команде COMPUTE, представлены в табл. 8. Таблица 8. Функции в команде COMPUTE.
Назначение основных конструкций команды COMPUTE описано в табл. 9. Таблица 9. Основные конструкции команды COMPUTE.
Для удаления всех определений COMPUTE используется команда CLEAR COMPUTES. Рассмотрим простой пример вычисления итоговых значений и редактирования SQL-операторов в SQL*Plus:
SQL> set pagesize 55
SQL> break on deptno skip 1
SQL> compute avg label 'Средняя' of sal on deptno
SQL> select deptno, ename, sal
2 from emp
3 order by deptno;
DEPTNO ENAME SAL
---------- ---------- ----------
10 CLARK 2450
KING 5000
MILLER 1300
********** ----------
Средняя 2916,66667
20 SMITH 800
ADAMS 1100
FORD 3000
SCOTT 3000
JONES 2975
********** ----------
Средняя 2175
30 ALLEN 1600
BLAKE 2850
MARTIN 1250
JAMES 950
TURNER 1500
WARD 1250
********** ----------
Средняя 1566,66667
14 строк выбрано.
SQL> compute sum of sal on report
SQL> /
...
тот же результат, поскольку не изменили условие BREAK
SQL> break on deptno skip 1 on report
SQL> list 2
2* from emp
SQL> list *
2* from emp
SQL> i where deptno in (10, 20)
SQL> /
DEPTNO ENAME SAL
---------- ---------- ----------
10 CLARK 2450
KING 5000
MILLER 1300
********** ----------
Средняя 2916,66667
20 SMITH 800
ADAMS 1100
FORD 3000
SCOTT 3000
JONES 2975
********** ----------
Средняя 2175
----------
sum 19625
8 строк выбрано.
Команда CLEARКоманда CLEAR позволяет сбросить значение ряда опций утилиты SQL*Plus, в частности, связанных с форматированием результатов. Она имеет следующий синтаксис:
Назначение опций команды CLEAR представлено в табл. 10. Таблица 10. Опции команды CLEAR.
Команды BTITLE и TTITLEУтилита SQL*Plus позволяет задавать заголовок для показа в качестве верхнего (команда TTITLE) и нижнего (команда BTITLE) колонтитула на каждой странице отчета. Эти команды имеют следующий синтаксис: Текст колонтитула необходимо брать в одиночные кавычки, если он состоит из нескольких слов. При выдаче одной из встроенных переменных SQL.* можно указывать конструкцию FORMAT. Соответствующие элементы формата см. в разделе, посвященном команде COLUMN. Конструкция <вкл-выкл> (ON | OFF) позволяет включать и отключать вывод колонтитулов, не влияя на их определения. Назначение спецификаций печати команд BTITLE и TTITLE представлено в табл. 11. Таблица 11. Спецификации печати в командах BTITLE, TTITLE, REPHEADER и REPFOOTER.
При вызове без параметров эти команды выдают текущий формат и признак вывода соответствующего колонтитула. Если спецификации колонтитула необходимо перенести на следующую строку, предыдущая строка завершается дефисом (-). Рассмотрим простой пример задания верхнего колонтитула для отчета:
SQL> ttitle left 'Список отделов' center '6 декабря 2001 г.' -
> right 'Стр.: ' format 999 SQL.PNO
SQL> select * from dept;
Список отделов 6 декабря 2001 г. Стр.: 1
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Команды REPHEADER и REPFOOTERКоманды REPHEADER и REPFOOTER позволяют задать текст, выдаваемый в начале и в конце каждого отчета, соответственно. При этом используются те же спецификации печати, что и в командах BTITLE и TTITLE (см. табл. 11 выше). Команды имеют следующий синтаксис: Если указана опция PAGE, то соответствующий текст выдается на отдельной странице. При вызове без параметров эти команды выдают текущий формат и признак вывода текста в начале и в конце отчета. Копирование данных из одной базы данных в другуюУтилита SQL*Plus предлагает собственные средства копирования данных из одной базы данных в другую и из одной таблицы в другую. Для этого используется команда COPY, которая позволяет: Команда COPY имеет следующий синтаксис: Она копирует данные, возвращаемые запросом, в таблицу в локальной или удаленной базе данных. Поддерживаются только базовые типы данных (CHAR, DATE, LONG, NUMBER, VARCHAR2) и в будущих версиях (после 9.0.1) поддержка этой команды не гарантируется. Если в конструкции <база данных> пароль не указан, SQL*Plus запросит его перед выполнением команды. Действия копирования описаны в табл. 12. Таблица 12. Действия копирования команды COPY.
Копировать данные можно не во все столбцы (тогда они должны быть совместимы по количеству и типам со списком выбора запроса), а только в указанные по именам. Если имя столбца содержит символы нижнего регистра или пробелы, его необходимо брать в двойные кавычки. Если список столбцов не задан, а целевую таблицу необходимо создавать, то их имена и типы будут такими же, как и в исходных таблицах. По умолчанию, утилита SQL*Plus выполняет фиксацию транзакции после успешного завершения команды COPY. Если выполнить команду SET COPYCOMMIT n, где n - положительное целое число, фиксация будет выполняться после каждого n-го пакета записей. Размер пакета задается с помощью команды SET ARRAYSIZE. Вся команда COPY должна поместиться на одной строке. Если необходимо перенести команду на следующую строку в конце строки необходимо ввести дефис (-). Рассмотрим простой пример копирования таблицы:
SQL> copy from scott/tiger@training -
> create emp10 -
> using select * from emp where deptno = 10;
Размер массива выборки/привязки равен 15. (arraysize равен 15)
Фиксация по завершении. (copycommit равен 0)
Максимальная длина равна 80. (long равна 80)
Таблица EMP10 создана.
3 строк выбрано из scott@training.
3 строк вставлено в EMP10.
3 строк зафиксировано в EMP10 по соединению DEFAULT HOST.
SQL> set linesize 100
SQL> select * from emp10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------ --------- ------- -------- ---------- ------ ------
7782 CLARK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 17.11.81 5000 10
7934 MILLER CLERK 7782 23.01.82 1300 10
Команды для работы с файламиУтилита SQL*Plus позволяет запоминать команды, операторы SQL и блоки PL/SQL в командных файлах (или сценариях). В дальнейшем эти командные файлы, - текстовые файлы базовой операционной системы - можно выполнять, загружать и редактировать. Создание командных файловСоздавать командные файлы можно вне среды SQL*Plus с помощью любого текстового редактора либо в среде SQL*Plus с помощью представленных выше команд редактирования или вызова внешнего редактора. Рассмотрим средства SQL*Plus - сохранение буфера SQL в файле - команду SAVE, и вызов внешнего редактора для редактирования буфера SQL - команду EDIT. Команда SAVEКоманда SAVE позволяет сохранить в файле содержимое SQL-буфера и имеет следующий синтаксис: Команда SAVE по умолчанию (или в режиме записи CREATE) создает файл с указанным именем и записывает в него содержимое буфера. В режиме REPLACE содержимое существующего файла заменяется содержимым буфера или файл создается. В режиме APPEND содержимое буфера дописывается в конец указанного файла. Если расширение не указано, предполагается стандартное расширение (SQL или заданное командой SET SUFFIX). Если имя файла совпадает с режимом записи, расширение указывать обязательно. Команда SAVE добавляет в командный файл строку, содержащую символ косой черты (/). Команда EDITКоманда EDIT позволяет вызвать текстовый редактор базовой операционной системы для редактирования указанного файла или содержимого SQL-буфера. Она имеет следующий синтаксис: Если расширение не указано, предполагается стандартное расширение (SQL или заданное командой SET SUFFIX). Файл для редактирования ищется в текущем рабочем каталоге. Если в нем такой файл не найден, он создается. При вызове без параметров содержимое буфера помещается в файл afiedt.buf в текущем рабочем каталоге, а затем этот файл загружается в текстовый редактор. Это стандартное имя можно переопределить с помощью команды SET EDITFILE. Если команда вызвана без параметров, а SQL-буфер пустой, выдается следующее сообщение об ошибке: SP2-0107: Нет ничего для сохранения. Если редактировался SQL-буфер, после завершения работы редактора содержимое соответствующего файла автоматически загружается в буфер. При этом последний символ последней строки (если она не пустая) усекается. Имя вызываемого текстового редактора содержится в пользовательской переменной SQL*Plus _EDITOR. Значение этой переменной можно задать с помощью команды DEFINE. Если ее значение не задано, используется стандартный редактор операционной системы (Notepad в Windows; задаваемый переменной среды EDITOR или ed в UNIX). Загрузка командных файловВ любой момент в ходе работы с SQL*Plus можно загрузить содержимое любого текстового файла в буфер SQL. Для этого используется команда GET со следующим синтаксисом: Если расширение не указано, предполагается стандартное расширение (SQL или заданное командой SET SUFFIX). Загружаемый файл должен содержать один оператор SQL или блок PL/SQL. SQL-оператор не должен завершаться точкой с запятой (;). Обычно загружаются командные файлы, созданные с помощью команды SAVE - они автоматически удовлетворяют данным условиям. Учтите, что команды собственно SQL*Plus в SQL-буфер не попадают, и если они окажутся в файле, загруженном с помощью команды PUT, то при выполнении содержимого буфера будут выданы сообщения об ошибках - команды SQL*Plus не являются операторами SQL! Также ошибка выдается, если файл содержит несколько операторов SQL или PL/SQL-блоков. По умолчанию и в режиме LIST содержимое загруженного файла выдается на экран. Подавить выдачу содержимого командного файла позволяет режим NOLIST. Выполнение командных файловХотя команда GET и позволяет загрузить содержимое файла в SQL-буфер, откуда оно в дальнейшем может быть выполнено с помощью команды /, этот способ не является универсальным, так как накладывает существенные ограничения на содержимое командного файла (см. выше). Для загрузки и выполнения командных файлов, содержащих любое количество команд SQL*Plus, SQL-операторов и PL/SQL блоков, используется команда START и ее сокращенные варианты, @ и @@. Команда START имеет следующий синтаксис: Файл, передаваемый команде START по имени (или по ссылке на Web-сайт в Oracle9i на платформе Windows), может содержать любые команды, которые можно вводить в диалоговом режиме. Если расширение в имени файла не указано, предполагается стандартное расширение (SQL или заданное командой SET SUFFIX). Указанный по короткому имени файл будет сначала искаться в текущем каталоге, затем - в каталогах, входящих в стандартный путь поиска (обычно задается переменной среды SQLPATH). Передача параметров командных файлов при вызовеПри вызове командного файла можно передавать параметры в виде аргументов командной строки. Утилита SQL*Plus подставляет значение аргументов командной строки вместо позиционных параметров командного файла (&1, &2 и т.д.). Первый аргумент подставляется вместо параметра &1, второй - вместо &2, и так далее. Рассмотрим простой пример: SQL> clear buffer buffer очищена SQL> input 1 select ename, sal from emp 2 where deptno = &1 3 SQL> save test Создано файл test SQL> start test 10 прежний 2: where deptno = &1 новый 2: where deptno = 10 ENAME SAL ---------- ---------- CLARK 2450 KING 5000 MILLER 1300 Сокращенные формы команды START (@, @@)Утилита SQL*Plus поддерживает две сокращенные формы команды START: @ и @@. Команда @ функционально аналогична команде START: SQL> @test 20 прежний 2: where deptno = &1 новый 2: where deptno = 20 ENAME SAL ---------- ---------- SMITH 800 JONES 2975 SCOTT 3000 ADAMS 1100 FORD 3000 Команда @@ работает так же, как и @, но дополнительно ищет командный файл в том же каталоге, что и командный файл, в котором она вызвана. Поэтому данная команда используется для вложенных вызовов командных файлов. Рассмотрим типичное использование команды @@ в файле ex_all.sql: set serverout on @@ex0304 @@ex0305 @@ex0308 @@ex0309 @@ex0603 @@ex0606 @@ex0607 @@ex0608 @@ex0705 @@excurvar При его запуске с помощью команды @ из того же каталога будут выполнены все перечисленные в нем командные файлы, а результаты их работы будут выданы на экран: SQL> @f:\usr\doc\orasdev\ex_all.sql SCOTT has a second highest salary! Процедура PL/SQL успешно завершена. Процедура создана. Ошибок нет. ... Коды возврата командных файловЕсли в ходе выполнения командного файла происходит ошибка Oracle, может потребоваться вернуть соответствующий код возврата базовой операционной системе. Это позволяет сделать команда WHENEVER SQLERROR со следующим синтаксисом: В ответ на ошибку в сценарии можно, тем самым, выйти из SQL*Plus и вернуть необходимый код возврата операционной системе, зафиксировать или откатить выполненные изменения, либо проигнорировать ошибку и продолжить выполнение сценария (с фиксацией или откатом изменений при необходимости). Комментарии в командных файлахВ командных файлах можно вводить и использовать комментарии трех видов: Команда REMARK имеет следующий простой синтаксис: Команда REMARK должна быть первой командой в строке. Задаваемый ею комментарий продолжается до конца строки. Комментарии /* ... */ можно вводить в виде отдельных строк в командном файле, в строке оператора SQL или PL/SQL-блока. После пары символов начала комментария (/*) обязательно должен идти пробел, иначе косая рассматривается как команда выполнения содержимого SQL-буфера. Такие комментарии не могут быть вложенными. Комментарий, введенный в командной строке SQL*Plus, не попадает в буфер SQL. Комментарии в виде -- ... можно вводить в конце строки с часть оператора SQL или PL/SQL-блока (такой комментарий продолжается до конца строки). Таким комментарием нельзя завершать команду SQL*Plus - он должен быть первой командой в строке. При размещении комментариев в командных файлах необходимо придерживаться ряда простых правил, связанных с особенностями работы утилиты SQL*Plus: Рассмотрим пример командного файла, использующего все виды комментариев: -- Это однострочный комментарий SQL*Plus set linesize 128; REM И это тоже однострочный комментарий SQL*Plus select ename, empno /* Это многострочный ** комментарий в ** SQL-операторе */ from emp -- однострочный комментарий в SQL-операторе where sal = 5000; Вот результат его выполнения: SQL> @f:\tmp.txt ENAME EMPNO ---------- ---------- KING 7839 Запоминание установок среды SQL*PlusУтилита SQL*Plus поддерживает многочисленные установки (см. раздел "Настройка среды SQL*Plus"), которые имеет смысл запоминать между сеансами. Для этого используется команда STORE: Эта команда записывает значения переменных среды SQL*Plus в командный файл базовой операционной системы: SQL> store set f:\env Создано file f:\env Вот примерное содержимое полученного файла f:\env.sql, созданного в SQL*Plus 8.1.6: Листинг 1. Типичные установки среды SQL*Plus. set appinfo OFF set appinfo "SQL*Plus" set arraysize 15 set autocommit OFF set autoprint OFF set autorecovery OFF set autotrace OFF set blockterminator "." set cmdsep OFF set colsep " " set compatibility NATIVE set concat "." set copycommit 0 set copytypecheck ON set define "&" set describe DEPTH 1 LINENUM OFF INDENT ON set markup HTML OFF SPOOL OFF ENTMAP ON PRE OFF set echo OFF set editfile "afiedt.buf" set embedded OFF set endbuftoken "" set escape OFF set feedback 6 set flagger OFF set flush ON set heading ON set headsep "|" set linesize 128 set logsource "" set long 80 set longchunksize 80 set newpage 1 set null "" set numformat "" set numwidth 10 set pagesize 25 set pause OFF set recsep WRAP set recsepchar " " set serveroutput ON size 2000 format WORD_WRAPPED set shiftinout invisible set showmode OFF set sqlblanklines OFF set sqlcase MIXED set sqlcontinue "> " set sqlnumber ON set sqlprefix "#" set sqlprompt "SQL> " set sqlterminator ";" set suffix "sql" set tab ON set termout ON set time OFF set timing OFF set trimout ON set trimspool OFF set underline "-" set verify ON set wrap ON Режим записи указывает, будет ли файл просто создан (CREATE, используется по умолчанию), переписан, если существует (REPLACE), или же значения установок среды SQL*Plus будут добавлены в конец существующего файла (APPEND). Полученный командный файл может быть выполнен командой START или ее сокращенными формами (@, @@). Запись в файл и печать результатов выполнения запросовУтилита SQL*Plus позволяет сбросить результаты выполнения команд в файл и распечатать их на стандартном принтере. Такой сброс называют спулингом. Для этого используется команда SPOOL (управляющая спулингом) со следующим синтаксисом: Команда SPOOL выдает результаты выполнения команд SQL*Plus в указанный файл и, возможно, на стандартный принтер, независимо от их отображения на экране. При вызове без параметров команда выдает состояние спулинга. Если не указано расширение имени файла, используется стандартное расширение (обычно, LST или LIS). Команда OFF прекращает спулинг. Команда OUT прекращает спулинг и посылает файл на стандартный принтер базовой операционной системы. Чтобы сбрасываемые в файл результаты не выдавались на экран, необходимо выполнить команду SET TERMOUT OFF. В листинге 2 представлен пример сценария SQL*Plus, использующего команду SPOOL для выдачи исходного текста хранимой программной единицы в файл с соответствующим именем. Этот файл, в свою очередь, является сценарием, пригодным для повторного создания хранимой программной единицы. Такой прием, - генерация командных файлов в результате выполнения командных файлов - часто используется опытными администраторами баз данных при работе с SQL*Plus. Листинг 2. Сценарий getcode.sql (© Tom Kyte, http://asktom.oracle.com).
set feedback off
set heading off
set termout off
set linesize 1000
set trimspool on
set verify off
spool &1..sql
prompt set define off
select decode( type||'-'||to_char(line,'fm99999'),
'PACKAGE BODY-1', '/'||chr(10),
null) ||
decode(line,1,'create or replace ', '' ) ||
text text
from user_source
where name = upper('&&1')
order by type, line;
prompt /
prompt set define on
spool off
set feedback on
set heading on
set termout on
set linesize 100
Вызывать данный сценарий можно, например, так: SQL> @f:\getcode ListBlackFridays Мы еще вернемся к сценарию getcode.sql в следующих разделах, посвященных параметрам и настройке среды SQL*Plus. Параметры командных файловУтилита SQL*Plus позволяет создавать командные файлы, запрашивающие у пользователя параметры и подставляющие их значение в команды по ходу выполнения. Для этого используются т.н. пользовательские переменные. Такие переменные определяются в командном файле, в частности, с помощью команды DEFINE. На пользовательские переменные можно ссылаться в командах, предваряя их имя символами & или &&. Конструкцию &<имя переменной> называют подставляемой переменной. Команды DEFINE и UNDFEFINEКоманда DEFINE позволяет определить пользовательскую переменную строкового типа и задать ей значение типа CHAR, либо получить значение определенной или всех пользовательских переменных. Эта команда имеет следующий синтаксис: Если текст, присваиваемый переменной, содержит пробелы или символы пунктуации, его надо брать в апострофы. При вызове без значения, команда DEFINE выдает значение переменной. Команда DEFINE без параметров выдает значение всех пользовательских переменных SQL*Plus, включая системные. Рассмотрим пример: SQL> define a=text SQL> define a DEFINE A = "text" (CHAR) SQL> define b=5 SQL> define DEFINE _SQLPLUS_RELEASE = "801060000" (CHAR) DEFINE _EDITOR = "Notepad" (CHAR) DEFINE _O_VERSION = "Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production With the Partitioning option JServer Release 8.1.6.0.0 - Production" (CHAR) DEFINE _O_RELEASE = "801060000" (CHAR) DEFINE A = "text" (CHAR) DEFINE B = "5" (CHAR) SQL> Как видите, утилита SQL*Plus автоматически определяет ряд системных пользовательских переменных. Для удаления как явно определенной пользовательской переменной, так и параметра командной строки сценария (см. описание команды START выше) используется команда UNDEFINE. После применения этой команды к переменной значение переменной теряется, и она становится неопределенной. Команда UNDEFINE имеет следующий простой синтаксис: Продолжая предыдущий пример: SQL> undefine a b SQL> define a SP2-0135: символ a UNDEFINED SQL> Использование подставляемых переменныхПодставляемую переменную можно использовать в любом месте команды SQL*Plus или SQL-оператора, кроме первого слова в командной строке (по первому слову утилита SQL*Plus определяет тип команды). Когда SQL*Plus встречает в командной строке подставляемую переменную, она подставляет значение этой переменной (запрашивая его, если переменная не определена). Используются подставляемые переменные для получения более гибких, интерактивных сценариев SQL*Plus. Рассмотрим простой пример:
SQL> select &func.(&col.) from &tab;
Введите значение для func: max
Введите значение для col: sal
Введите значение для tab: emp
прежний 1: select &func.(&col.) from &tab
новый 1: select max(sal) from emp
MAX(SAL)
---------
5000
Как видите, если в команде встречается не определенная явно ранее подставляемая переменная, SQL*Plus запрашивает ее значение. Затем на экран выдается вид команды до и после подстановки всех значений (это можно отключить с помощью команды SET VERIFY OFF), и команда выполняется. В нашем примере мы подставили в команду конкретную функцию агрегирования, имя столбца, по которому выполняется агрегирование, и имя таблицы. Обратите внимание, что если необходимо вставить значение подставляемой переменной перед не пробельным символом, необходимо указать точку (.) после имени переменной. В ответ на запрос значения можно ввести любую строку, в том числе с пробелами. Если значение должно быть взято в апострофы и эти апострофы не указаны явно в команде с подставляемой переменной, необходимо будет ввести значение в апострофах. SQL*Plus читает данные с клавиатуры, даже если входной и выходной потоки терминала перенаправлены в файлы. Если же сценарий запущен в пакетном режиме, данные читаются из соответствующего файла. Если введенное значение совпадает с подставляемой переменной (начинается с &), то (по крайней мере, в версии 8.1.6) выдается сообщение об ошибке: SQL> define emp = dept SQL> select * from &tab; Введите значение для tab: &emp прежний 1: select * from &tab новый 1: select * from &emp SP2-0552: Переменная привязки "EMP" не описана. Подстановка без повторного запросаЕсли использовать одну и ту же подставляемую переменную с символом & в одной команде несколько раз, значение будет запрашиваться каждый раз заново:
SQL> select max(&col), avg(&col), min(&col) from &tab;
Введите значение для col: sal
Введите значение для col: sal
Введите значение для col: sal
Введите значение для tab: emp
прежний 1: select max(&col), avg(&col), min(&col) from &tab
новый 1: select max(sal), avg(sal), min(sal) from emp
MAX(SAL) AVG(SAL) MIN(SAL)
---------- ---------- ----------
5000 2073,21429 800
Чтобы значение переменной запрашивалось только один раз, используется подстановка с двумя амперсантами (&&): SQL> c /(&col/(&&col 1* select max(&&col), avg(&col), min(&col) from &tab SQL> c /(&col/(&&col 1* select max(&&col), avg(&&col), min(&col) from &tab SQL> c /(&col/(&&col 1* select max(&&col), avg(&&col), min(&&col) from &tab SQL> / Введите значение для col: sal Введите значение для tab: emp прежний 1: select max(&&col), avg(&&col), min(&&col) from &tab новый 1: select max(sal), avg(sal), min(sal) from emp MAX(SAL) AVG(SAL) MIN(SAL) ---------- ---------- ---------- 5000 2073,21429 800 Подстановка параметров командных файловПодстановка переменных выполняется и для позиционных параметров, переданных при вызове сценария. На эти параметры можно ссылаться как на &1, &2 и т.д. Если значение для них в командной строке не передано, SQL*Plus запрашивает значения при вызове сценария. Подстановка позиционных параметров выполняется только при вызове сценария командами START (или ее сокращенными формами @, @@). Рассмотрим пример:
SQL> clear buffer
buffer очищена
SQL> input
1 select &1 from &2
2 .
SQL> save f:\subst.sql
Создано файл f:\subst.sql
SQL> @f:\subst max(sal) emp
прежний 1: select &1 from &2
новый 1: select max(sal) from emp
MAX(SAL)
----------
5000
SQL> @f:\subst
прежний 1: select &1 from &2
новый 1: select max(sal) from emp
MAX(SAL)
----------
5000
SQL> undef 1 2
SQL> @f:\subst
Введите значение для 1: min(sal)
Введите значение для 2: emp
прежний 1: select &1 from &2
новый 1: select min(sal) from emp
MIN(SAL)
----------
800
ОграниченияПодставляемые переменные нельзя использовать в командах редактирования буфера SQL (APPEND, CHANGE, DEL, INPUT) и в других командах, где эта подстановка "не имеет смысла", в частности, в комментариях. Команды редактирования буфера считают символ & обычным и используют его буквально (см. пример выше). Системные переменные, влияющие на подстановкуВ табл. 13 представлены системные установки, влияющие на подстановку пользовательских переменных. Таблица 13. Системные установки, влияющие на подстановку переменных.
Взаимодействие с пользователемСтандартный механизм запроса значений пользовательских переменных дает ограниченные средства взаимодействия с пользователем - ввод значений в ответ на стандартные приглашения. Утилита SQL*Plus позволяет управлять выдачей сообщений и запросом значений переменных. Команда PROMPTДля выдачи на экран произвольного текста используется команда PROMPT со следующим синтаксисом: Она выдает указанный текст или пустую строку (при вызове без параметров). Если необходимо выдать несколько строк, для каждой строки выполняется отдельная команда PROMPT. Команда ACCEPTСчитать строку и запомнить ее в указанной пользовательской переменной определенного типа (выдавая, при необходимости, приглашение) позволяет команда ACCEPT со следующим синтаксисом: Если указанная в команде ACCEPT пользовательская переменная не существует, SQL*Plus создает ее. Опции команды ACCEPT описаны в табл. 14. Таблица 14. Опции команды ACCEPT.
Рассмотрим простой пример совместного использования команд 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 имеет следующий синтаксис: Эта команда выдает пустую строку, затем строку текста, если он указан, или еще одну пустую строку, и ждет подтверждения от пользователя. Ввод эта команда ожидает с терминала (при интерактивном запуске), даже если входной и выходной потоки перенаправлены. При работе в пакетном режиме для продолжения необходимо наличие новой строки в файле, откуда берется входной поток. Рассмотрим простой пример. Изменим файл 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 после вывода соответствующего приглашения. Связываемые переменныеСвязываемые переменные - это создаваемые в SQL*Plus переменные, на которые можно ссылаться (как на хост-переменные) в блоках PL/SQL. Таким переменным можно, например, присваивать значения в блоках PL/SQL или использовать их значения во включенных в блоки SQL-операторах. Значения связываемых переменных можно затем выдавать в SQL*Plus. Команда VARIABLEДля создания связываемой переменной используется команда VARIABLE со следующим синтаксисом: При вызове без параметров команда VARIABLE выдает список всех переменных, созданных в сеансе. Если указать только имя переменной, выдается информация только об этой переменной. Связываемые переменные можно использовать как параметры хранимых процедур или непосредственно, в анонимных PL/SQL-блоках. Их нельзя использовать в команде COPY или присвоить им значение в SQL-операторах, не входящих в PL/SQL-блоки. Вместо связанной переменной, не получившей явно значения, при необходимости подставляется значение NULL. Рассмотрим простой пример использования связываемых переменных:
SQL> var
SP2-0568: Не объявлены переменные привязки.
SQL> var dep number
SQL> begin
2 select deptno into :dep from emp
3 where sal = (select max(sal) from emp);
4 end;
SQL> /
Процедура PL/SQL успешно завершена.
SQL> select * from dept where deptno = :dep;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
SQL> var dep2 number
SQL> c /:dep/:dep2
1* select * from dept where deptno = :dep2
SQL> /
строки не выбраны
SQL> var
переменная dep
тип данных NUMBER
переменная dep2
тип данных NUMBER
Мы использовали связываемую переменную для передачи значения из одного оператора SQL в другой, так и не выдав его на экран. Чтобы значения используемых в команде связываемых переменных выдавались автоматически, необходимо выполнить команду SET AUTOPRINT ON. Типы данных для связываемых переменных аналогичны соответствующим типам данных PL/SQL. Переменные типа REFCURSOR позволяют работать с курсорными переменными PL/SQL. Утилита SQL*Plus обрабатывает связываемые переменные такого типа особым образом. Курсор, соответствующий курсорной переменной, открывается явно, а закрывается после выдачи значения или при завершении сеанса. При выдаче значения на экран выдается результирующее множество соответствующего запроса. Рассмотрим пример:
SQL> set autoprint on
SQL> var a refcursor;
SQL> begin
2 open :a for select * from dept;
3 end;
4 /
Процедура PL/SQL успешно завершена.
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TRAINING KIEV
SQL> exec open :a for select ename, sal from emp where deptno = :dep;
Процедура PL/SQL успешно завершена.
DEP
----------
10
ENAME SAL
---------- ----------
CLARK 2450
KING 5000
MILLER 1300
Результаты, выдаваемые при показе значений связываемой переменной типа REFCURSOR можно форматировать так же, как и результаты выполнения SQL-оператора SELECT. Значение такой переменной выдается только один раз, - затем результирующее множество надо выбирать повторно. Для явной выдачи на экран значения связываемой переменной используется команда PRINT. Команда PRINTКоманда PRINT имеет следующий синтаксис: Эта команда выдает текущее значение перечисленных связываемых переменных. При вызове без параметров выдаются значения всех связываемых переменных. Продолжая предыдущий пример:
SQL> print a
SP2-0625: Ошибка печати переменной "a"
SQL> print
DEP
----------
10
DEP2
----------
SP2-0625: Ошибка печати переменной "a"
SQL> set autoprint off
SQL> exec open :a for select ename,sal,comm from emp where deptno=:dep;
Процедура PL/SQL успешно завершена.
SQL> print dep a
DEP
----------
10
ENAME SAL COMM
---------- ---------- ----------
CLARK 2450
KING 5000
MILLER 1300
Трассировка операторовУтилита SQL*Plus позволяет автоматически получать отчет о способе выполнения оператора, выбранном оптимизатором SQL, а также статистическую информацию о выполнении. Этот отчет выдается после успешного выполнения операторов SELECT, INSERT, UPDATE и DELETE. Такой отчет полезен для контроля и настройки производительности этих операторов. Для управления данным отчетом используется команда SET AUTOTRACE. Эта команда имеет пять опций:
Для использования этой возможности SQL*Plus необходимо создать в схеме пользователя таблицу PLAN_TABLE и получить роль PLUSTRACE (предоставить ее может только DBA). Выполним следующие действия: SQL> set autotrace on SP2-0613: Невозможно проверить формат или существование PLAN_TABLE SP2-0611: Ошибка разблокирования EXPLAIN report SP2-0618: Невозможно найти Идентификатор Сеанса. Проверьте, разрешена ли роль PLUSTRACE SP2-0611: Ошибка разблокирования STATISTICS report Как видите, по умолчанию эта возможность не поддерживается. Создадим таблицу с помощью сценария $ORACLE_HOME/rdbs/admin/utlxplan.sql: SQL> @g:\oracle\ora81\rdbms\admin\utlxplan Таблица создана. Затем создадим роль PLUSTRACE, дадим ей необходимые привилегии, а затем предоставим ее роли DBA (с помощью сценария $ORACLE_HOME/sqlplus/admin/plustrce.sql):
SQL> connect system/manager as sysdba
Соединено.
SQL> @g:\oracle\ora81\sqlplus\admin\plustrce
SQL>
SQL> drop role plustrace;
drop role plustrace
*
ошибка в строке 1:
ORA-01919: роль 'PLUSTRACE' не существует
SQL> create role plustrace;
Роль создана.
SQL>
SQL> grant select on v_$sesstat to plustrace;
Привилегии предоставлены.
SQL> grant select on v_$statname to plustrace;
Привилегии предоставлены.
SQL> grant select on v_$session to plustrace;
Привилегии предоставлены.
SQL> grant plustrace to dba with admin option;
Привилегии предоставлены.
SQL> set echo off
Теперь предоставим роль PLUSTRACE пользователю, который будет использовать трассировку: SQL> grant plustrace to scott; Привилегии предоставлены. Проверяем, что трассировочный отчет теперь выдается:
SQL> connect scott/tiger
Соединено.
SQL> set autotrace on
SQL> set pagesize 25
SQL> select ename, dname, sal
2 from emp, dept
3 where emp.deptno = dept.deptno;
ENAME DNAME SAL
---------- -------------- ----------
SMITH RESEARCH 800
ALLEN SALES 1600
WARD SALES 1250
JONES RESEARCH 2975
MARTIN SALES 1250
BLAKE SALES 2850
CLARK ACCOUNTING 2450
SCOTT RESEARCH 3000
KING ACCOUNTING 5000
TURNER SALES 1500
ADAMS RESEARCH 1100
JAMES SALES 950
FORD RESEARCH 3000
MILLER ACCOUNTING 1300
14 строк выбрано.
План выполнения
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=2 Bytes=88)
1 0 HASH JOIN (Cost=3 Card=2 Bytes=88)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=41 Bytes=1353)
Статистика
----------------------------------------------------------
62 recursive calls
8 db block gets
6 consistent gets
0 physical reads
0 redo size
1267 bytes sent via SQL*Net to client
424 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
14 rows processed
Подробнее использование возможностей трассировки в SQL*Plus рассмотрено в отдельном модуле, посвященном настройке производительности. Настройка среды SQL*PlusСреда SQL*Plus - очень гибкая и имеет широкие возможности настройки по требованиям пользователя. Эти настройки выполняются, в основном, с помощью команды SET. Мы неоднократно использовали команду SET в примерах данного модуля. В следующем разделе представлено ее формальное описание. Команда SETКоманда SET позволяет установить системную переменную, изменяющую свойства среды SQL*Plus для текущего сеанса. Она имеет следующий синтаксис: Имена, описания и возможные значения основных системных переменных для команды SET представлены в табл. 15. Таблица 15. Основные системные переменные SQL*Plus
Рассмотрим пример задания некоторых системных переменных SQL*Plus:
SQL> set time on
16:43:39 SQL> set timing on
16:43:43 SQL> set underline off
16:43:55 SQL> set pagesize 1000
16:44:02 SQL> set linesize 128
16:44:12 SQL> select * from dept
16:44:18 2 ;
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TRAINING KIEV
Затрач.время: 00:00:00.80
16:44:20 SQL>
Команда SHOWКоманда SHOW позволяет получить значение системных переменных SQL*Plus, а также ряд информации о среде, базе данных, к которой подключена утилита, и об ошибках в последней выполненной команде. Эта команда имеет следующий синтаксис: Назначение опций представлено в табл. 16. Таблица 16. Опции команды SHOW.
Рассмотрим пример использования ряда опций команды SHOW:
17:21:24 SQL> connect system/manager
Соединено.
17:21:47 SQL> show sga
Total System Global Area 152581388 bytes
Fixed Size 70924 bytes
Variable Size 78741504 bytes
Database Buffers 73691136 bytes
Redo Buffers 77824 bytes
17:21:49 SQL> show sqlcode
sqlcode 0
17:33:36 SQL> select * from emp;
select * from emp
*
ошибка в строке 1:
ORA-00942: таблица или представление пользователя не существует
Затрач.время: 00:00:00.40
17:33:43 SQL> show sqlcode
sqlcode 942
17:33:50 SQL> show spool
spool OFF
17:34:52 SQL> show linesize
linesize 128
17:36:07 SQL> show user
USER имеет значение "SYSTEM"
17:36:10 SQL> show parameters buff
NAME TYPE VALUE
buffer_pool_keep string
buffer_pool_recycle string
db_block_buffers integer 17991
log_buffer integer 32768
use_indirect_data_buffers boolean FALSE
Другие полезные командыЕсть еще несколько полезных команд, не относящихся ни к одной из рассмотренных выше категорий. Вот некоторые из них. Команда EXECUTEЭта команда выполняет один оператор PL/SQL. Чаще всего, это вызов хранимой процедуры или функции. Команда, по сути, неявно создает анонимный блок, в котором выполняется оператор. Рассмотрим пример: 18:02:02 SQL> set timing off 18:02:36 SQL> set serverout on 18:02:41 SQL> exec ListBlackFridays(sysdate, 3); 13.09.02 13.12.02 13.06.03 Процедура PL/SQL успешно завершена. Команда PASSWORDКоманда PASSWORD позволяет изменить пароль пользователя, не отображая его на экране. Эта команда имеет следующий простой синтаксис: По умолчанию, изменяется пароль текущего пользователя. Чтобы изменять пароль другого пользователя, необходима соответствующая привилегия: 18:02:49 SQL> set time off SQL> connect system/manager Соединено. SQL> password scott Изменение пароля для scott Новый пароль: ***** Повторите новый пароль: ***** SQL> connect scott/tiger Соединено. Команды администрирования базы данныхРяд команд утилиты SQL*Plus предназначен для АБД. По сути, SQL*Plus - полнофункциональное средство администрирования. Доступные в SQL*Plus команды администрирования рассматриваются в данном разделе. Запуск базы данныхНачиная с Oracle8, утилиту SQL*Plus можно использовать для запуска и остановки базы данных (ранее для этих целей использовались утилиты svrmgrl и SQL*DBA). Запуск базы данных состоит из трех шагов: Запуск базы данных в SQL*Plus выполняется командой STARTUP, имеющей следующий синтаксис: Все варианты команды STARTUP, так или иначе, запускают экземпляр (выделяется память и запускаются фоновые процессы). Опции команды STARTUP представлены в табл. 17. Таблица 17. Опции команды STARTUP.
Эту команду может выполнять только пользователь, подключившийся как SYSOPER или SYSDBA к выделенному серверному процессу. По умолчанию используется опция OPEN. Команда STARTUP OPEN RECOVER монтирует и открывает базу данных, даже если полное восстановление закончилось неудачно. Остановка базы данныхКоманда SHUTDOWN в SQL*Plus останавливает текущий экземпляр Oracle, к которому подключен пользователь, и может при этом закрыть и демонтировать базу данных. Эту команду можно применять только для серверов версии 8 и выше. Команда SHUTDOWN имеет следующий синтаксис:
Назначение опций команды SHUTDOWN описано в табл. 18: Таблица 18. Опции команды SHUTDOWN.
Эту команду может выполнять только пользователь, подключившийся как SYSOPER или SYSDBA к выделенному серверному процессу. По умолчанию используется опция NORMAL. Управление архивированием журналов повторного выполненияКаждая база данных Oracle имеет набор из двух или более файлов журнала повторного выполнения, который обобщенно называют просто журналом повторного выполнения. В этот журнал записываются изменения данных, которые используются при восстановлении базы данных после сбоев. Для защиты от сбоя самого журнала сервер Oracle поддерживает его мультиплексирование (поддержку нескольких копий на разных дисках в виде группы) и архивирование. Если база данных работает в режиме ARCHIVELOG, выполняется архивирование оперативного логического журнала, что обеспечивает полное восстановление при сбое как экземпляра, так и диска с журналами повторного выполнения, поскольку все изменения данных сохраняются в отдельном, заархивированном журнальном файле. Для управления режимом архивирования журналов повторного выполнения утилита SQL*Plus предлагает команду ARCHIVE LOG, которая имеет следующий синтаксис: Эта команда позволяет начать или остановить автоматическое архивирование оперативных файлов журнала повторного выполнения, явно заархивировать указанные по номерам файлы или выдать информацию о них. Опции команды ARCHIVE LOG описаны в табл. 19. Таблица 19. Опции команды ARCHIVE LOG.
Если место назначения для архива не указано явно в командной строке, используется параметр инициализации LOG_ARCHIVE_DEST (стандартное место назначения). Если новое место назначения указано с опцией START, оно становится стандартным. В остальных случаях туда записываются только соответствующие архивы, инициированные данной командой. Команду ARCHIVE LOG может выполнять только пользователь, подключившийся как SYSOPER или SYSDBA. Она применяется только к текущему экземпляру. Для управления другими экземплярами и кластером в целом используется SQL-оператор ALTER SYSTEM. Если все оперативные группы файлов журнала повторного выполнения заполнены и не доступны для повторного использования (т.е. сервер работает в режиме ARCHIVELOG, и они не скопированы) работа базы данных приостанавливается. Явное архивирование решает эту проблему. Рассмотрим простой пример использования команды ARCHIVE LOG для просмотра информации о текущем состоянии архивирования журналов повторного выполнения: SQL> archive log list Режим журнала базы данных Режим архива Автоматическое архивирование Включено Место размещения архива g:\oracle\oradata\training Самая старая последовательность оперативных журналов 745 Следующая последовательность журналов для архивирования 747 Текущая последовательность журналов 747 SQL> archive log 745 ORA-16013: журнал 1 с номером последовательности 745 не требует архивирования ORA-00312: оперативный протокол 1 процесса 1: 'G:\ORACLE\ORADATA\TRAINING\REDO01.LOG' Восстановление базы данныхЕсли база данных работала в режиме ARCHIVELOG, после сбоя носителя ее можно полностью или частично восстановить. Для этого в SQL*Plus предлагается команда RECOVER, имеющая следующий, весьма объемный, синтаксис: Опции команды RECOVER кратко описаны в табл. 20. Таблица 20. Опции команды RECOVER.
Для выполнения команды RECOVER необходимо обладать ролью SYSDBA и подключиться через выделенный серверный процесс. Чтобы можно было выполнить восстановление носителей для всей базы данных в целом (для всех табличных пространств), база данных должна быть смонтирована, но закрыта, а все требующие восстановления табличные пространства должны быть включены (online). Для восстановления же отдельного табличного пространства база данных должна быть смонтирована и открыта, а само табличное пространство отключено. Для восстановления файла данных, база данных может оставаться открытой и смонтированной, а поврежденные файлы - отключены (если только они не входят в табличное пространство SYSTEM). Рассмотрим простой пример остановки, запуска и восстановления носителя из SQL*Plus: SQL> connect system/manager as sysdba Соединено. SQL> shutdown База данных закрыта. База данных размонтирована. Экземпляр ORACLE завершен. SQL> startup mount Экземпляр ORACLE запущен. Total System Global Area 152581388 bytes Fixed Size 70924 bytes Variable Size 78741504 bytes Database Buffers 73691136 bytes Redo Buffers 77824 bytes База данных смонтирована. SQL> recover database until time '2001-12-09:00:00:00' Восстановление носителя завершено. SQL> alter database open; Дополнительные источники информацииУпражненияДля освоения всех возможностей утилиты SQL*Plus необходим практический опыт ее использования. Упражнения позволят вам его получить. Упражнение 1Напишите командный файл SQL*Plus, выдающий все записи указанной таблицы в файл с именем <имя таблицы>.unl в виде строк, поля которых разделены символом вертикальной черты (|). Заголовки столбцов не выдавать. Например, для таблицы dept содержимое файла должно иметь следующий вид: 10|ACCOUNTING|NEW YORK 20|RESEARCH |DALLAS 30|SALES |CHICAGO 40|OPERATIONS|BOSTON 50|TRAINING |KIEV Файл такого вида подходит для загрузки в базы данных Informix :). Упражнение 2Напишите командный файл SQL*Plus, выдающий данные всех таблиц в схеме данного пользователя в файлы с соответствующими именами в виде полей через заданный разделитель, как в упражнении 1. Упражнение 3Напишите командный файл SQL*Plus, выдающий на экран данные таблицы emp, предваряя денежные суммы знаком доллара и заменяя неизвестные значения прочерками. Снабдите создаваемый отчет заголовком и колонтитулами. Для каждого отдела выдайте значение средней заработной платы. В конце отчета выдайте сумму начисленных сотрудникам комиссионных. Упражнение 4Напишите командный файл SQL*Plus, выдающий по указанному имени представления текст оператора для его создания (CREATE VIEW) в файл с именем <имя>.sql. См. представление USER_VIEWS в словаре данных, описывающее представления данного пользователя. Длина каждой строки в файле не должна превышать 80 символов, чтобы файл было удобно читать. Упражнение 5Напишите сценарий SQL*Plus (без применения PL/SQL), увеличивающий вдвое зарплату всем сотрудникам отдела, средняя зарплата в котором ниже, чем средняя зарплата по всей организации (см. таблицы emp и dept). Затем сценарий должен выдать (в указанный при вызове файл) отчет о сотрудниках с указанием средней зарплаты по отделам. Снабдите столбцы отчета заголовками на русском языке. Copyleft (no c) 2001-2004 В. Кравчук, OpenXS Initiative, Cоставление, перевод, дополнения, упражнения и примеры |
|
CITForum © 1997–2025