


     Г Л А В А   4
                              Форматирование Результатов Запроса

   Данная глава объясняет, как форматировать результаты ваших запросов, при
получении окончательных отчетов. Здесь обсуждаются следующие темы:
 - изменение заголовка колонки
 - форматирование колонок NUMBER, CHAR, LONG и DATE
 - копирование, печать, сброс атрибутов колонки
 - подавление дублированных значений и вставка пробелов для наглядности
 - вычисление и печать суммарных строк (общее количество, среднее, минимум,
   максимум, и др.)
 - печать и удаление пробелов и определение суммарных строк
 - установка размеров листа
 - помещение заголовков в начале и конце каждого листа
 - вывод значений колонки и текущей даты или номера листа в заголовках
 - печать и подавление описаний заголовков листа
 - запись результатов запросов в файл или принтер

Читайте данную главу, сидя за компьютером, и пытайтесь выполнить
демонстрируемые примеры. Перед началом работы, убедитесь, что вы имеете
доступ к таблицам-примерам, описанным в главе 1.


     Форматирование колонок С помощью команды SQL*PLUS COLUMN, вы можете
 изменить заголовок и переформатировать данные колонки в результатах
 запросов.

     Изменение заголовка  колонки
Когда SQL*PLUS выводит результаты запросов, по умолчанию он использует имена
колонок и выражений в качестве заголовков колонок. Имена колонок часто очень
коротки и загадочны, а выражения могут быть тяжелы для понимания.

Вы можете определить более полезные заголовки колонок параметром HEADING
команды COLUMN в следующем формате:

COLUMN имя_колонки HEADING заголовок_колонки

Пример 4-1         Чтобы получить отчет по таблице EMP с новыми заголовками
Изменение          для колонок DEPTNO, ENAME, SAL, введите следующие команды:
заголовка колонки

              SQL> COLUMN DEPTNO HEADING Department
              SQL> COLUMN ENAME  HEADING Employee
              SQL> COLUMN SAL    HEADING Salary
              SQL> COLUMN COMM   HEADING Commission
              SQL> SELECT DEPTNO, ENAME, SAL, COMM
                2  FROM  EMP
                3  WHERE JOB = 'SALESMAN';

              SQL*PLUS покажет следующие результаты:

              Departament Employee      Salary Commission
              ----------- ---------- --------- ----------
                      30 ALLEN             1600      300
                      30 WARD              1250      500
                      30 MARTIN       1250     1400
                      30 TURNER       1500        0


                                    -- 37 --



Замечание:   Новые заголовки будут действовать, пока вы не введете другие
заголовки, или не сбросите формат каждой колонки, или не выйдите из SQL*PLUS.

Чтобы заменить заголовок колонки на два или более слова, заключите новый
заголовок в одиночные или двойные кавычки при вводе команды COLUMN. Для
вывода заголовка более чем на одной строке используйте вертикальную черту (|)
там, где необходимо начать новую строку. (Можно в качестве разделителя
использовать другой символ, установив переменную HEADSEP команды SET.
Подробности смотри в главе 6.)


      Пример 4-2    Расщепление заголовка  колонки
  Чтобы присвоить колонке ENAME заголовок EMPLOYEE NAME и разделить новый
 заголовок на две строки, введите:

     SQL> COLUMN ENAME HEADING 'Employee|Name'

 Сейчас снова выполните запрос командой наклонная черта (/):  SQL> /

SQL*PLUS покажет следующие результаты:

          Employee
Departament Name          Salary Commission
----------- ---------- --------- ----------
        30 ALLEN             1600      300
        30 WARD              1250      500
        30 MARTIN            1250     1400
        30 TURNER            1500        0

Чтобы заменить символ подчеркивания заголовка каждой колонки, установите
переменную UNDERLINE команды SET.

Пример 4-3        Чтобы заменить символ используемый для подчеркивания
Установка     заголовка на знак равенства и снова выполнить запрос,
символа       введите следующие команды:подчеркивания
              SQL> SET UNDERLINE =
              SQL> /

              SQL*PLUS покажет следующие результаты:

                        Employee
              Departament Name          Salary Commission
              =========== ========== ========= ==========
                      30 ALLEN             1600      300
                      30 WARD              1250      500
                      30 MARTIN       1250     1400
                      30 TURNER       1500        0

              Сейчас восстановим символ подчеркивания обратно на тире:

              SQL> SET UNDERLINE '-'

Заметим, что тире необходимо заключить в кавычки; иначе SQL*PLUS
интерпретирует тире как символ переноса и будет ожидать продолжения команды
на следующей строке.




                                    -- 38 --



     Форматирование  NUMBER колонок
Обычно SQL*PLUS показывает в числах столько цифр,  сколько требуется для
указанной точности, стандартная точность (ширина) определяется значением
переменной NUMWIDTH команды SET (обычно 10). Вы можете задать разные форматы
для колонок типа NUMBER, используя модель формата в команде COLUMN.  С
помощью модели формата задают вид колонок при печати, для представления цифр
используется 9.

Команда COLUMN указывает колонку, которую вы желаете форматировать, и
используемую модель, как показано ниже:

COLUMN имя_колонки FORMAT модель

Используйте модели форматов, чтобы добавить запятые, знак доллара, угловые
скобки, ведущие нули к числа форматируемой колонки. Также можно подвергать
числа округлению, выводить знак числа справа (обычно он выводится слева),
выводить числа в экспоненциальной форме.

Чтобы использовать одну форматную модель для одной колонки, объедините модель
в одной команде COLUMN (сь пример 4-4). Полный список моделей форматов смотри
в главе 6.

Пример 4-4      Чтобы вывести SAL со знаком доллара, запятой и нулями вместо
Форматирование  пробелов для любого нулевого значения, введите следующую
NUMBER          команду:
колонок
              SQL> COLUMN SAL FORMAT $99,990

              Выполним команду снова:
              SQL> /

              SQL*PLUS покажет следующие результаты:

                        Employee
              Departament Name          Salary Commission
              ----------- ---------- --------- ----------
                      30 ALLEN           $1,600      300
                      30 WARD            $1,250      500
                      30 MARTIN     $1,250     1400
                      30 TURNER     $1,500        0

Используйте ноль в модели формата, как показано выше, когда вы пользуетесь
другим форматом (например знак доллара) и желаете вывести ноль вместо пробела
для нулевых величин.

Замечание:  Модель формата действует до тех пор, пока вы не введете новый, не
            сбросите формат колонки или не покинете SQL*PLUS.

     Форматирование  колонок CHAR, LONG, DATE
  Обычно SQL*PLUS показывает значения CHAR, используя ширину колонки опреде-
ленную для БД или ширину заголовка колонки (выбирает наибольшее).  Ширина для
вывода колонок LONG задается значением переменной LONG команды SET (обычно
80). Колонки типа DATE, неотформатированные функцией SQL TO_CHAR, по умолчанию
выводятся шириной в 9 символов.  Подробную информацию о форматировании
колонок DATE смотри в главе 6 (описание параметра FORMAT команды COLUMN).




                                    -- 39 --



Вы можете изменить ширину вывода колонок CHAR, LONG, DATE с помощью команды
COLUMN с форматом состоящем из буквы А (для алфавитно-цифровых) с последующим
числом, которое задает ширину вывода.

В команде COLUMN необходимо указать имя колонки и модель формата:
COLUMN имя_колонки FORMAT модель

Если вы укажите ширину меньшую чем ширина заголовка, SQL*PLUS обрезает
заголовок. Заметим, что заголовок для NUMBER никогда не урезается.

      Пример 4-5
      Форматирование  CHAR колонок
   Чтобы установить ширину колонки ENAME в четыре символы и снова выполнить
запрос, введите:

SQL> COLUMN ENAME FORMAT A4
SQL> /

SQL*PLUS покажет следующие результаты:

          Empl
Departament Name    Salary Commission
----------- ---- --------- ----------
        30 ALLE       $1,600      300 N

        30 WARD       $1,250      500
        30 MART       $1,250     1400 IN

        30 TURN       $1,500        0 ER

Замечание:  Модель формата остается в действии, пока вы не введете новый, не
сбросите формат колонки, или не покините SQL*PLUS.

Если переменная WRAP команды SET установлена в ON (значение по умолчанию),
имя служащего сворачивается на следующую строку после четырех символов, как
показано в приере 4-5. Если WRAP установлено в OFF, имена урезаются до
четырех символов.

Системная переменная WRAP управляет всеми колонками; вы можете заменить
установку WRAP для некоторой колонки, с помощью параметров WRAPPED,
WORD_WRAPPED, TRUNCATED команды COLUMN. Подробнее смотри главу 6. Параметр
WORD_WRAPPED команды COLUMN используется ниже в данной главе.

Заметим, что заголовок колонки обрезается несмотря на установку WRAP или
параметры команды COLUMN.

Сейчас вернем формат колоноки в первоначальное состояние:

SQL> COLUMN ENAME FORMAT A10


     Копирование атрибутов вывода для колонки
 Когда вы хотите назначить аналогичные атрибуты для нескольких колонок, вы
можете уменьшить длину вводимых вами команд с помощью параметра LIKE команды
COLUMN. Параметр LIKE приказывает SQL*PLUS скопировать атрибуты вывода из уже
определенной колонки в новую колонку, кроме тех параметров, которые задаются
в данной команде.


                                    -- 40 --



      Пример 4-6  Копирование атрибутов вывода для колонки
  Чтобы присвоить колонке COMM аналогичные атрибуты вывода, что и у колонки
SAL, но с другим заголовком,  введите следующую команду:

SQL> COLUMN COMM LIKE SAL HEADING Bonus

Выполним снова запрос:

SQL> /

SQL*PLUS покажет следующие результаты:

          Employee
Departament Name          Salary      Bonus
----------- ---------- --------- ----------
        30 ALLEN           $1,600     $300
        30 WARD            $1,250     $500
        30 MARTIN          $1,250   $1,400
        30 TURNER          $1,500       $0


     Печать и сброс  атрибутов вывода колонки

  Чтобы распечатать текущие атрибуты колонки, используйте команду COLUMN
 только с указанием имени колонки, как показано ниже:

COLUMN имя_колонки

Чтобы распечатать текущие атрибуты вывода всех колонок, введите команду
COLUMN без имен колонок и параметров:

COLUMN

Чтобы сбросить атрибуты вывода у колонки (восстановить значения по
умолчанию), используйте параметр CLEAR команды COLUMN как показано ниже:

COLUMN имя_колонки CLEAR

Для сброса атрибутов у всех колонок, используйте параметр COLUMN команды
CLEAR.

Пример 4-7         Чтобы сбросить атрибуты вывода у всех колонок к из 
значениям Сброс Атрибутов    по умолчанию, введите следующую команду:  
вывода 
колонки       SQL> CLEAR COLUMNS columns cleared

              Вы можете поместить команду CLEAR COLUMNS в начало командного 
              файла для проверки того, что уже введенные команды COLUMN не 
              влияют на результаты ваших запросов.

        Запрещение и Восстановление 
   Вы можете подавить и восстановить атрибуты вывода, которые атрибутов вывода
вы назначили определенной колонке. Для подавления атрибутов колонки вывода 
колонки, введите команду COLUMN в следующем формате:

              COLUMN имя_колонки OFF



                                    -- 41 --



 Фраза OFF сообщает SQL*PLUS, что необходимо использовать атрибуты вывода для
данной колонки определенные по умолчанию, но сами атрибуты вывода удалять не 
надо. Для восстановления атрибутов необходимо ввести команду COLUMN с фразой 
ON:
              COLUMN имя_колонки ON


        Печать Строки символов после

   Как вы знаете, по умолчанию SQL*PLUS переносит содержимое значения 
свернутой колонки на дополнительные строки, когда значение колонки колонки      
не помещается в отведенную для нее ширину. Если вы хотите втавить разделитель 
записей (строка символов или пустая строка), используйте RECSEP и RECSEPCHAR 
переменные команды SET.

   RECSEP определяет, когда необходимо печатать строку символов: 
если вы установите RECSEP в EACH, то печать будет после каждой строки; 
если RECSEP=WRAPPED, то печать будет после каждой свернутой строки; 
если RECSEP=OFF, то печать будет запрещена. 
По умолчанию RECSEP = WRAPPED.

RECSEPCHAR устанавливает символ, печатаемый в каждой строке. В переменной 
RECSEPCHAR можно задать любой символ.

  Если вы хотите, чтобы сворачиваемые слова не разрывались мужду строками, 
используйте фразу WORD_WRAPPED в команде COLUMN как показано ниже:

              COLUMN имя_колонки WORD_WRAPPED

Пример 4-8         Чтобы напечатать строку из тире после каждой свернутой
Печать             строки колонки, введите следующие команды:
символов после
свернутой          SQL> SET RECSEP WRAPPED
колонки            SQL> SET RECSEPCHAR '-'

              Сейчас уменьшим длину колонки LOC и сообщим SQL*PLUS, что при 
              свертке необходимо переносить слова на новые строки полностью:

              SQL> COLUMN LOC FORMAT A7 WORD_WRAPPED

              И наконец, введем и выполним следующий запрос:

              SQL> SELECT * FROM DEPT;

              SQL*PLUS выведет следующее:

                 DEPTNO DNAME          LOC
              --------- ------------- -------
                     10 ACCOUNTING    NEW
                                  YORK
              --------------------------------------------------
              ----------
                     20 RESEARCH  DALLAS
                     30 SALES     CHICAGO
                     40 OPERATIONS     BOSTON




                                    -- 42 --



   Если вы установили RECSEP равным EACH, SQL*PLUS будет печатать
ограничительную строку после каждой записи (после каждого отдела в данном
случае).  Перед тем как продолжить работу установите RECSEP в состояние OFF,
чтобы подавить печать разделителя записей:

              SQL> SET RECSEP OFF


        Улучшение Отчета пробелами и итговыми строками

   Когда вы используете фразу ORDER BY в команде SQL SELECT, записи с одинако-
выми значениями в сортируемой колонке выводятся вместе на устройство вывода.
Вы можете улучшить данный вывод, используя команды SQL*PLUS BREAK и COMPUTE,
для того чтобы создать подмножество записей и добавить пустые и/или итоговые
строки после каждого подмножества записей.

  Колонка указанная вами в команде BREAK называется колонкой прерывания. Вклю-
чая колонку прерывания во фразу ORDER BY, вы создаете выразительное (наглядное)
подмножество записей на экране. Затем вы можете добавить форматирование подмно
жества в той же команде BREAK, и добавить печать итоговой строки (содержащей
сумму, среднее, и т.д.), указав колонку прерывания в команде COMPUTE.

   Например, данный запрос без команд BREAK и COMPUTE,

              SELECT DEPTNO, ENAME, SAL
              FROM EMP
              WHERE SAL < 2500
              ORDER BY DEPTNO;

              покажет следующие неотформатированные результаты:

                  DEPTNO ENAME             SAL
              ---------- ---------- ----------
                      10 CLARK            2450
                      10 MILLER           1300
                      20 SMITH             800
                      20 ADAMS            1100
                      30 ALLEN            1600
                      30 JAMES             950
                      30 TURNER           1550
                      30 WARD             1250
                      30 MARTIN           1250

 Чтобы сделать этот более наглядным, используйте команду BREAK для установки
 колонки DEPTNO в качестве колонки прерывания. BREAK позволяет подавить
 печать одинаковых значениий в DEPTNO, и поместить пустые строки или начать
 новый лист между отделами. Вы можете использовать BREAK совместно с COMPUTE
 для подсчета и печати итоговых строк, содержащих общую сумму (и/или среднее,
 максимум, минимум, среднеквадратичное отклонение, дисперсию, или счетчик
 числа записей) зарплаты для каждого отдела и для всех отделов.


          Запрет печати одинаковых
        значений в колонке прерывания





                                    -- 43 --



По умолчанию команда BREAK запрещает печать одинаковых значений в указанной
колонке или выражении. Таким образом, чтобы подавить печать одинаковых
значений в колонке указанной во фразе ORDER BY, используйте команду BREAK в
ее простейшем варианте:

BREAK ON колонка_прерывания

Замечание:  Всякий раз когда вы указали колонку или выражение в команде
BREAK, используйте фразу ORDER BY с той же колонкой или выражением. Если вы
не сделаете этого, прерывания будут иметь случайный характер.

Пример 4-9    Чтобы подавить печать одинаковых номеров отделов в отчете
Запрет
печати        показаном выше, введите следующие команды:
одинаковых
значений в         SQL> BREAK ON DEPTNO
колонке       SQL> SELECT DEPTNO, ENAME, SAL
прерывания           2  FROM EMP
                3  WHERE SAL < 2500
                4  ORDER BY DEPTNO;

              SQL*PLUS покажет следующие результаты:

                  DEPTNO ENAME             SAL
              ---------- ---------- ----------
                      10 CLARK            2450
                         MILLER           1300
                      20 SMITH             800
                         ADAMS            1100
                      30 ALLEN            1600
                         JAMES             950
                         TURNER           1550
                         WARD             1250
                         MARTIN           1250

        Вставка пустых строк, когда изменяется значение колонки прерывания

   Вы можете вставлять пустые строки или начинать новую страницу каждый раз,
когда изменяется значение колонки прерывания. Чтобы вставить n пустых строк,
используйте команду BREAK в следующей форме:

              BREAK ON колонка_прерывания SKIP n

              Чтобы начать новую страницу, команда вводится так:

              BREAK ON колонка_прерывания SKIP PAGE


Пример 4-10   Для размещения пустой строки между отделами, введите
Вставка
пробелов      следующую команду:  когда изменяется значение колонки
              SQL> BREAK ON DEPTNO SKIP 1 прерывания Выполним запрос снова:

              SQL> /
              SQL*PLUS покажет следующие результаты:




                                    -- 44 --



                  DEPTNO ENAME             SAL
              ---------- ---------- ----------
                      10 CLARK            2450
                         MILLER           1300

                      20 SMITH             800
                         ADAMS            1100

                      30 ALLEN            1600
                         JAMES             950
                         TURNER           1550
                         WARD             1250
                         MARTIN           1250

        Вставка пробелов после каждой записи
  Вы можете захотеть вставлять пустые строки или страницу после каждой записи.
Чтобы пропустить n строк после каждой записи, используйте BREAK следующем
формате:
              BREAK ON ROW SKIP n

  Чтобы пропустить страницу после каждой записи, используйте BREAK в
следующей форме:

              BREAK ON ROW SKIP PAGE

Использование  Предположим, что вы используете во фразе ORDER BY больше
приемов        одной колонки, и хотите вставлять пустые строки, когда
множественных  значение в любой из этих колонок изменяется.  Каждая пробелов
команда BREAK, которую вы вводите, замещает предыдущую.

              Таким образом, если вы хотите использовать разные приемы помеще-
              ния пробелов в отчет или вставлять пробелы, когда изменяется
              значение в более чем одной сортируемой колонке, вам необходимо
              указать несколько колонок и действий в одной команде BREAK.

Пример 4-11   Сначала добавим еще одну колонку к текущему
запросу:
Приемы
комбинирования     SQL> L
пробелов        1  SELECT DEPTNO, ENAME, SAL
                2  FROM EMP
                3  WHERE SAL < 2500
                4* ORDER BY DEPTNO
              SQL> 1 SELECT DEPTNO, JOB, ENAME, SAL
              SQL> 4 ORDER BY DEPTNO, JOB

           Сейчас, чтобы пропустить страницу при изменении значения DEPTNO и
           одну строку при изменении значения JOB, введите следующую команду:

              SQL> BREAK ON DEPTNO SKIP PAGE ON JOB SKIP 1

              Выполним новый запрос:
              SQL> /

                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      10 CLERK     MILLER           1300


                                    -- 45 --



                         MANAGER   CLARK            2450

                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      20 CLERK     SMITH             800
                                   ADAMS            1100

                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      30 CLERK     JAMES             950

                         SALESMAN  ALLEN            1600
                                   TURNER           1550
                                   WARD             1250
                                   MARTIN           1250

        Печать и удаление определений прерываний

   Вы можете распечатать текущие определения колонок прерываний, введя
команду BREAK без параметров:

     BREAK

Вы можете удалить текущие определения колонок прерываний, введя команду CLEAR
с параметром BREAKS:

     CLEAR BREAKS

Можно помещать команду CLEAR BREAKS в начало командного файла, чтобы
предотвратить влияние на выполнение запросов предыдущих команд BREAK.


        Вычисление итоговых строк, когда изменяется
         значение колонки прерывания

   Если вы собираете записи отчета в подмножества командой BREAK, вы можете
производить различные вычисления над записями каждого подмножества. Эти
вычисления производятся функциями SQL*PLUS команды COMPUTE.  Используйте
команды BREAK и COMPUTE вместе в следующей форме:

   BREAK ON колонка_прерывания COMPUTE функция OF колонка колонка ... ON
колонка_прерывания

Можно включать несколько колонок прерывания и соответсвующих действий, таких
как пропуск строк, в команду BREAK, также аналогичный список м.б. во фразе ON
команды COMPUTE. Чтобы включить множественную колонку прерывания и
соответствующие действия в BREAK вместе с командой COMPUTE, используйте эти
команды в следующем формате:

BREAK ON колонка_прерыв1 SKIP PAGE ON колонка_прерыв2 SKIP 2
COMPUTE функция OF колонка колонка ... ON колонка_прерыв2

Команда COMPUTE не имеет никакого действия без соответствующей команды BREAK.

Команду COMPUTE можно использовать для колонок NUMBER, и в некоторых случаях
для всех типов колонок. Подробнее смотри главу 6.

В следующей таблице приведен список вычислительных функций и их назначение:

                                    -- 46 --



Пример 4-1         Функция   Действие
Вычислительные
──────────────────────────────────────────────────────────
Функции       SUM       Вычисление суммы значений в колонке
              MIN       Вычисление минимального значения в колонке
              MAX       Вычисление максимального значения в колонке
              AVG       Вычисление среднего значения в колонке
              STD       Вычисление среднеквадратичного отклонения в колонке
              VAR       Вычисление дисперсии
              COUNT     Вычисление Количества ненулевых значений в колонке
              NUM       Вычисление количества записей в колонке

Функция, которую вы укажите в команде COMPUTE, действует на все колонки,
которые вы написали после OF и до ON. Вычисляемые значения печатются перед
разделительной строкой, когда изменяется значение упорядочиваемой колонки.

Все вычислительные функции (кроме NUM) игнорируют нулевые значения.

Пример 4-12    Чтобы вычислить общую сумму окладов (SAL) в отделе, сначала
Вычисление и   распечатайте текущее описание BREAK: Печать
промежуточных  SQL> BREAK
сумм               break on DEPTNO skip page nodup
                        on JOB skip 1 nodup

              Далее введите такую команду COMPUTE, и выполните текущий запрос:

              SQL> COMPUTE SUM OF SAL ON DEPTNO
              SQL> /

              SQL*PLUS выведет следующие результаты:

                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      10 CLERK     MILLER           1300

                         MANAGER   CLARK            2450

              ********** *********            ----------
              sum                             3750

                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      20 CLERK     SMITH             800
                                   ADAMS            1100

              ********** *********            ----------
              sum                             1900


                  DEPTNO JOB       ENAME             SAL
              ---------- --------- ---------- ----------
                      30 CLERK     JAMES             950

                         SALESMAN  ALLEN            1600
                                   TURNER           1550
                                   WARD             1250



                                    -- 47 --



                                   MARTIN           1250
              ********** *********            ----------
              sum                             6550

   Заметим, что формат колонки SAL управляет внешним видом суммы SAL, также
как каждым значением колонки SAL. Когда вы устанавливаете формат колонки
NUMBER, вы должны предусмотреть достаточную ширину для суммы в вашем отчете.

        Вычисление итоговой строки в конце отчета

       Вы можете вычислять и печатать итоговые строки основанными на все
значениях колонки с помощью команд BREAK и COMPUTE в следующем формате:

              BREAK ON REPORT
              COMPUTE функция OF колонка колонка ... ON REPORT

Пример 4-13   Чтобы вычислить и напечатать итоговую сумму окладов для всех
Вычисление и  продавцов, сначала введите следующие команды BREAK и COMPUTE
печать общего
итога         SQL> BREAK ON REPORT
              SQL> COMPUTE SUM OF SAL ON REPORT

              Затем, введите и выполните новый запрос:

              SQL> SELECT ENAME, SAL
                2  FROM EMP
                3  WHERE JOB = 'SALESMAN';

              Вы увидите следующий результат:

              ENAME             SAL
              ---------- ----------
              ALLEN            1600
              WARD             1250
              MARTIN           1250
              TURNER           1550
              ********** ----------
              sum            5600

      Чтобы напечатать итоговую сумму (или общее среднее, общий максимум и
      т.д.) в дополнение к подитогам (или среднее по подгруппе и т.д.),
      включите колонку прерывания и фразу ON REPORT в вашу команду BREAK.
      Затем, введите одну команду COMPUTE для колонки прерывания и другую для
      вычисления ON REPORT:

      BREAK ON колонка_прерывания ON REPORT
      COMPUTE функция OF колонка ON колонка_прерывания
      COMPUTE функция OF колонка ON REPORT


Вычисление нескольких Сумм и строк
              Вы можете вычислять и печатать те же виды сумм на различных
              колонках. Для этого необходимо ввести отдельные команды COMPUTE
              для каждой колонки.

Пример 4-14   Чтобу напечатать общую сумму окладов и коммисионных для всех
Вычисление         продавцов, сначала введите следующую колонку COMPUTE:
одинаковых

                                    -- 48 --



типов сумм         SQL> COMPUTE SUM OF SAL COMM ON REPORT
для разных
колонок       Вам не надо вводить команду BREAK, так как вы уже ввели ее в
              примере 4-13. Сейчас добавим COMM к текущему запросу:

              SQL> 1 SELECT ENAME, SAL, COMM

              И наконец выполним исправленный запрос:

              SQL> /

              ENAME             SAL        COMM
              ---------- ---------- ----------
              ALLEN            1600         300
              WARD             1250         500
              MARTIN           1250        1400
              TURNER           1550           0
              ********** ---------- ----------
              sum            5600       2200

      Вы можете также напечатать несколько суммарных строк по тем же колонкам
      прерываний. Для этого включите функцию для каждой суммарной строки в
      команду COMPUTE:

      COMPUTE функция функция ... OF колонка ON колонка_прерывания

      Если вы включите несколько колонок после OF и до ON, COMPUTE вычислит и
      напечатает значения для всех указанных колонок.

Пример 4-15   Чтобы вычислить среднее и сумму окладов отдела продавцов,
Вычисление    сначала введите следующие команды BREAK и COMPUTE:
нескольких
суммарных          SQL> BREAK ON DEPTNO
строк для          SQL> COMPUTE AVG SUM OF SAL ON DEPTNO
данных колонок
прерывания         Затем введем и выполним следующий запрос:

              SQL> SELECT DEPTNO, ENAME, SAL
                2  FROM EMP
                3  WHERE DEPTNO = 30
                4  ORDER BY DEPTNO, SAL;

              SQL*PLUS покажет следующие результаты:

                  DEPTNO ENAME              SAL
              ---------- ---------- ----------
                      30 JAMES              950
                         WARD              1250
                         MARTIN            1250
                         TURNER            1500
                         ALLEN             1600
                        BLAKE              2850
              **********             ---------
              avg                 1566.6667
              sum                     9400


Печать и удаление определений COMPUTE

                                    -- 49 --



    Вы можетераспечатаь текущие определения COMPUTE, посредством ввода
команды COMPUTE без параметров:

              COMPUTE

              Вы можете удалить все определения COMPUTE, введя команду CLEAR
              с фразой COMPUTE.

Пример 4-16   Чтобы удалить все определения COMPUTE и сопровождающие его
Удаление      определения BREAK, введите следующую команду:
определения
COMPUTE       SQL> CLEAR BREAKS
              breaks cleared
              SQL> CLEAR COMPUTES
              computes cleared

    Вы можете захотеть поместить команды CLEAR BREAKS и CLEAR COMPUTES в 
начало каждого командног файла, чтобы убедиться, что уже введенные команды 
BREAK и COMPUTE не влияют на выполнение запросов вашего командного файла.


        Определение заголовков и размеров страниц

  Слово страница означает полный экран с информацией на вашем дисплее, или 
страницу печатаемого отчета.  Вы можете помещать заголовки в начале и конце 
каждой страницы, устанавливать количество строк на странице, и определять 
ширину каждой строки.

        Установка верхнего и нижнего заголовка

   Как вы уже увидели, вы можете устанавливать заголовок для вывода вверх каж-
дой страницы отчета.  Также можно заголовок, печатаемый внизу каждой страницы.
Команда TTITLE определяет верхний заголовок; Команда BTITLE определяет нижний 
заголовок.

Команда TTITLE или BTITLE состоит из имени команды с последующими параметрами,
задающими позицию или формат и значение CHAR, которое вы хотите помещать в 
заданную позицию или в заданном формате. Вы можете включить несколько наборов 
фраз и значений CHAR:

TTITLE фраза_позиция значение_char 
       фраза_позиция значение_char ...
или

BTITLE фраза_позиция значение_char 
       фраза_позиция значение_char ...

   Часто используемые фразы команд TTITLE и BTITLE приведены в следующей 
таблице. Подробное описание параметров TTITLE и BTITLE смотри в главе 6.

Таблица 4-2
Часто используемые
фразы TTITLE и Фраза BTITLE
           Пример    Описание
───────────────────────────────────────────────────────────
    COL n     COL 72    Помещает следующее CHAR-значение в указанную колонку 



                                    -- 50 --



                        строки
    SKIP n    SKIP 2    Пропуск n строк. Если n > 1, перед следующим 
                        CHAR-значением появятся n-1 пустых строк.

    LEFT      LEFT      Выранивает влево следующее CHAR-значение 
    CENTER    CENTER    Центрирует следующее CHAR-значение
    RIGHT     RIGHT     Выранивает вправо следующее CHAR-значение


Пример 4-17        Чтобы поместить верхний и нижний заголовки на каждую
Печать верхнего    страницу отчета, введите:
и нижнего заголовков
             SQL> TTITLE CENTER 'ACME WIDGET SALES DEPARTMENT PERSONNEL REPORT'
             SQL> BTITLE CENTER 'COMPANY CONFIDENSIAL'

              Сейчас выполним текущий запрос:

              SQL> /

              SQL*PLUS покажет следующие результаты:

                           ACME WIDGET SALES DEPARTMENT
              PERSONNEL REPORT
              DEPTNO     ENAME              SAL
              ---------- ---------- ----------
                      30 JAMES              950
                      30 WARD              1250
                      30 MARTIN            1250
                      30 TURNER            1500
                      30 ALLEN             1600
                     30 BLAKE              2850


                                  COMPANY CONFIDENSIAL

Позиционирование    Отчет в предыдущем упражнении может выглядеть
элементов      привлекательно, если вы выделите имя компании и напечатаете
заголовка      вид отчета и имя отдела после каждой ограничительно строки.
               Это также поможет уменьшить длину строки и таким образом центр 
               заголовка будет ближе к данным.

               Вы можете сделать эти изменения, добавив дополнительные фразы 
               к команде TTITLE, и сбросив системную переменную LINESIZE, как 
               показано в следующем примере.

 Пример 4-18          Чтобы повторить печать персонального отчета с новым 
Позиционирование      размещением верхнего заголовка, введите команду:  
элементов заголовка
                     SQL> TTITLE CENTER 'A C M E  W I D G E T' SKIP 1 - > 
               CENTER ================= SKIP 1 LEFT 'PERSONNEL REPORT' - > 
               RIGHT 'SALES DEPARTMENT' SKIP 2 SQL> SET LINESIZE 60 SQL> /


               SQL*PLUS покажет следующие результаты:





                                    -- 51 --



                                 A C M E  W I D G E T
                                 ====================
               PERSONNEL REPORT                        SALES
               DEPARTMENT

                   DEPTNO ENAME              SAL
               ---------- ---------- ----------
                       30 JAMES              950
                       30 WARD              1250
                       30 MARTIN            1250
                       30 TURNER            1500
                       30 ALLEN             1600
                      30 BLAKE              2850
                                COMPANY CONFIDENSIAL

  Фразы LEFT, RIGHT, CENTER помещают следующее значение в начало, конец, 
центр строки. Фраза SKIP сообщает SQL*PLUS, что необходимо переместиться на 
одну или несколько строк вниз.

Заметим, что мужду последней записью и нижним заголовком нет пустой строки. 
Последняя строка нижнего заголовка печатается на последней строке страницы. 
Количество пустых строк между последней строкой отчета и нижнего заголовка 
зависит от длины страницы, от количества строк отведенных под верхний заголо-
вок, от количества записей распечатанных на странице.  В предыдущем примере 
верхний заголовок занимает три строки. Позднее в данной главе вы изучите, как 
устанавливать количество строк на странице.

Для печати n пустых строк перед нижним заголовком, используйте фразу SKIP n в 
начале команды BTITLE.  Например, чтобы пропустить одну строку перед нижним 
заголовком в предыдущем примере, можно ввести следующую команду:

               BTITLE SKIP 1 CENTER 'COMPANY CONFIDENSIAL'


        Смещение вправо элемента заголовка для того,

   вы можете использовать фразу COL в TTITLE и BTITLE чтобы сместить вправо 
элементы заголовка на указанное количество позиций. Например, COL 1 помещает 
следующее значение  впервой позиции, это эквивалентно LEFT или нулевому 
смещению. COL 15 помещает элемент заголовка с 15-й позиции, т.е.  отступ 
равен 14 позициям.

Пример 4-19        Чтобы напечатать имя компании слева, а наименование отчета
Смещение вправо    на следующей строкес отступом в 5 позиций,введите:
элемента заголовка

             SQL> TTITLE LEFT 'ACME WIDGET' SKIP 1 -
                > COL 6 'SALES DEPARTMENT PERSONNEL REPORT' SKIP 2

               Выполним снова текущий запрос:

               ACME WIDGET
                    SALES DEPARTMENT PERSONNEL REPORT

                   DEPTNO ENAME              SAL
               ---------- ---------- ----------
                       30 JAMES              950
                       30 WARD              1250

                                    -- 52 --



                       30 MARTIN            1250
                       30 TURNER            1500
                       30 ALLEN             1600
                      30 BLAKE              2850

                                COMPANY CONFIDENSIAL

Ввод длинного  Если вам необходимо ввести заголовок длинной более 500
заголовка      символов, вы можете использовать команду SQL*PLUS
DEFINE         для помещения текста каждой строки заголовка в разные 
               пользовательские переменные:

               SQL> DEFINE LINE1 = 'This is the first line ...'
               SQL> DEFINE LINE2 = 'This is the second line ...'
               SQL> DEFINE LINE3 = 'This is the third line ...'

               Затем, необходимо указать эти переменные в ваших
               командах TTITLE и BTITLE:

               SQL> TTITLE CENTER LINE1 SKIP 1 CENTER LINE2 SKIP
               1 CENTER -
                    LINE3

Вывод номера       Вы можете вывести текущий номер страницы и другие значения
страницы и         поддерживемые системой в ваш заголовок, введя имя значения
других системных   как элемент заголовка, например:
значений в
заголовках          TTITLE LEFT имя_значения_системы

               Существуе пять значений поддерживаемых системой, которые вы 
               можете вывести в заголовок, наиболее часто используемая из 
               которых это SQL.PNO (текущий номер страницы). Список данных 
               значений приведен в главе 6.

Пример 4-20       Чтобы вывести текущий номер страницы сверху в каждой
Вывод текущего    странице, в строке с именем компании, введите такую команду:
номера страницы
в заголовок   SQL> TTITLE LEFT 'ACME WIDGET' RIGHT 'PAGE:'
                 > SQL.PNO SKIP 2

               Выполним снова текущий запрос:

               SQL> /


               ACME WIDGET                             PAGE:  1

                   DEPTNO ENAME              SAL
               ---------- ---------- ----------
                       30 JAMES              950
                       30 WARD              1250
                       30 MARTIN            1250
                       30 TURNER            1500
                       30 ALLEN             1600
                       30 BLAKE             2850

                                COMPANY CONFIDENSIAL


                                    -- 53 --



               Заметим, что SQL.PNO имеет формат шириной в десять позиций. 
               Можно изменить данный формат фразой FORMAT в команде TTITLE 
               (или BTITLE).

Пример 4-21     Чтобы уменьшить количество пробелов между словом PAGE: и
Форматирование  номером страницы, введите снова команду TTITLE:
системных
значений в      SQL> TTITLE LEFT 'ACME WIDGET' RIGHT 'PAGE:'FORMAT 999 -
заголовке          > SQL.PNO SKIP 2

               Выполним снова текущий запрос:

               SQL> /

               ACME WIDGET                             PAGE:   1

                   DEPTNO ENAME              SAL
               ---------- ---------- ----------
                       30 JAMES              950
                       30 WARD              1250
                       30 MARTIN            1250
                       30 TURNER            1500
                       30 ALLEN             1600
                      30 BLAKE              2850

                                COMPANY CONFIDENSIAL

        Печать, Подавление, Восстановление
        описаний заголовков страницы введите
  Чтобы распечатать описание заголовка страницы, соответствующую команду 
заголовка без параметров:
               TTITLE
               BTITLE

  Чтобы подавить (запретить) описание заголовка, введите:

               TTITLE OFF
               BTITLE OFF

  Эти команды заставляют SQL*PLUS приостановить вывод заголовков в отчетах, 
  но не сбрасывают описание самого заголовка. Можно восстановить текущее 
  описание заголовка:

               TTITLE ON
               BTITLE ON

Вывод значения
колонки в      Вы можете захотеть создать создать главный/детальный отчет,
заголовок      в котором выводятся измененое значение главной колонки вверху 
               каждой страницы с результатами детального отчета для данного 
               значения внизу. Вы можете ссылаться на значение колонки в 
               верхнем заголовке, с помощью сохранения требуемого значения в 
               переменной и ссылки на переменную в команде TTITLE. 
               Используйте команду COLUMN для определения переменной в 
               следующем формате:

               COLUMN имя_колонки NEW_VALUE имя_переменной


                                    -- 54 --



               Вы должны включить главную колонку во фразу ORDER BY и в 
               команду BREAK, используя фразу SKIP PAGE.


Пример 4-22     Создание Главного/Детального

Предположим, что вы хотите создать отчет, который выводит два разных
административных служебных номера, каждый вверху  на отдельной странице, и
 люди относящиеся к * * *  * *

SQL> COLUMN MGR NEW_VALUE MGRVAR
NOPRINT

Так как вы будете выводить административный служебный номер в заголовке, вам
не надо печатать его в детальном отчете. Фраза NOPRINT, которую вы ввели
выше, сообщает SQL*PLUS, что не надо печатать колонку MGR.

Затем, включите метку и значение в заголовок вашего отчета, введите введите
соответствующую команду BREAK, и подавите нижний заголовок:

SQL> TTITLE LEFT 'Manager: ' MGRVAR SKIP 2
SQL> BREAK ON MGR SKIP PAGE
SQL> BTITLE OFF

И наконец, введите и выполните следующий запрос:

SQL> SELECT MGR, ENAME, SAL, DEPTNO
  2  FROM EMP
  3  WHERE MGR IN (7698, 7839);

SQL*PLUS выведет следующее:

Manager:    7698

ENAME               SAL      DEPTNO
---------- ---------- ----------
ALLEN              1600       30
WARD               1250       30
TURNER        1500       30
MARTIN        1250       30
JAMES               950       30

Manager:    7839

ENAME               SAL      DEPTNO
---------- ---------- ----------
JONES         2975       20
BLAKE         2850       30
CLARK         2450       10

Если вы хотите напечатать значение колонки внизу каждой страницы, вы можете
использовать команду COLUMN в следующей форме:

COLUMN имя_колонки OLD_VALUE имя_переменной





                                    -- 55 --



SQL*PLUS распечатает нижний заголовок как часть процесса прерывания к новой
странице- после обнаружения нового значения для главной колонки.  Поэтому,
если Вы просто укажите NEW_VALUE для главной колонки, вы должны дать значение
для следующего детального поднабора записей. OLD_VALUE запоминает значение
главной колонки, которое было действительным до прерывания страницы.

     Вывод текущей  даты в заголовках

   Вы конечно можете напечатать дату в ваше отчете, простым заданием значения
в заголовке. Это приемлемо для незапланированных отчетов, но если вы хотите
получить тот же отчет повторно, вы отдадите предпочтение автоматическому
помещению текущей даты в отчет. Это можно осуществить созданием переменной,
содержащей текущую дату.

Для создания такой переменной (в данном примере она названа _DATE), Вы можете
добавить следующую команду в ваш файл LOGIN:

SET TERMOUT OFF
BREAK ON TODAY
COLUMN TODAY NEW_VALUE _DATE
SELECT TO_CHAR(SYSDATE, 'fmMonth DD, YYYY') TODAY
FROM DUAL;
CLEAR BREAKS
SET TERMOUT ON

Когда вы стартуете SQL*PLUS, эти команды помещают значение SYSDATE (текущая
дата) в переменную с именем _DATE. Чтобы вывести текущую дату, вы можете
указать _DATE в заголовке, аналогично ссылке на другие переменные.

Модель формата даты, которую вы включили в команду SELECT вашего файла LOGIN,
определяет формат, в котором SQL*PLUS будет печатать дату. Подробнее о
моделях форматов смотри в "Справочное руководство по языку SQL" или в
"Руководство пользователя по языку SQL".

Вы также можете ввести эти команды интерактивно после командной подсказки;
пример смотри COLUMN в главе 6.


     Установка размеров   Страницы
    Обычно, страница отчета содержит верхний заголовок, заголовки колонок,
результаты вашего запроса и нижний заголовок. SQL*PLUS выдает длинные отчеты
на нескольких последовательных страницах, каждая со своим заголовком и
заголовками колонок.  Количество данных, выведенное SQL*PLUS-м на каждой
странице, зависит от текущих размеров страницы.

По умолчанию размеры страницы, используемые SQL*PLUS, показаны ниже:

 * количество строк перед верхним заголовком: 1
 * количество строк на странице, от верхнего заголовка до нижнего заголовка
   страницы: 14
 * количество символов в строке: 80

Можно изменять данные установки настраивая на длину экрана вашей ЭВМ, или для
печати.





                                    -- 56 --



Вы можете изменить длину страницы с помощью системных переменных NEWPAGE и
PAGESIZE. Например, Вы можете захотеть сделать это, когда вы печатаете отчет,
так как длина листа равна 66 строкам, а не 15 (общее количество строк на
странице равно сумме NEWPAGE и PAGESIZE).

Чтобы установить количество строк между началом каждой страницы и верхним
заголовком, используйте переменную NEWPAGE команды SET:

SET NEWPAGE количество_строк

Если вы установите NEWPAGE = 0, SQL*PLUS пропустит ноль строк и напечатает
символ подачи формы (formfeed) в начале каждой страницы. На большинстве типов
экранов компьютеров, символ подачи формы чистит экран и перемещает курсор в
начало первой строки. Когда вы печатаете отчет, символ подачи формы загружает
новый лист бумаги, даже если допустимая длина страницы меньше, чем реальная
длина листа бумаги.

Чтобы установить количество строк на странице от верхнего заголовка,
используйте переменную PAGESIZE команды SET:

SET PAGESIZE количество_строк

Вы можете захотеть уменьшить размер строки для центрирования заголовков
вашего отчета. Или, вам будет необходимо увеличить размер строки для печати
на широких листах. Вы можете изменить ширину строки, используя переменную
LINESIZE команды SET:

SET LINESIZE количество_символов


Пример 4-23      Чтобы установить длину страницы равной 66 строкам,  очистите
Установка        экран (или вставьте в принтер новый лист) в начале каждой
Размеров         страницы, и установить длину строки в 32 символа, введите
Страницы         следующие команды:
**********
SQL> SET PAGESIZE 66
SQL> SET NEWPAGE 0
SQL> SET LINESIZE 32

Сейчас введите и выполните следующие команды, чтобы получить следующие
результаты:

SQL> TTITLE CENTER 'ACME WIDGET PERSONNEL REPORT'
SKIP 1 -
> CENTER '10-JAN-89' SKIP 2
SQL> COLUMN DEPTNO HEADING DEPARTMENT
SQL> COLUMN ENAME HEADING EMPLOYEE
SQL> COLUMN SAL FORMAT $99,999 HEADING SALARY
SQL> SELECT DEPTNO, ENAME, SAL
  2  FROM EMP
  3  ORDER BY DEPTNO;

SQL*PLUS выдаст следующие результаты:

 ACME WIDGET PERSONNEL REPORT
           10-JAN-89



                                    -- 57 --



DEPARTMENT EMPLOYEE       SALARY
---------- ---------- ----------
       10 CLARK          $2,450
       10 KING           $5,000
       10 MILLER         $1,300
       20 SMITH            $800
       20 ADAMS          $1,100
       20 FORD           $3,000
       20 SCOTT          $3,000
       20 JONES          $2,975
       30 ALLEN          $1,600
       30 BLAKE          $2,850
       30 MARTIN         $1,250
       30 JAMES            $950
       30 TURNER         $1,500
       30 WARD           $1,250

Сейчас сбросим PAGESIZE, NEWPAGE, LINESIZE в их значения по умолчанию:

SQL> SET PAGESIZE 14
SQL> SET NEWPAGE 1
SQL> SET LINESIZE 80

Чтобы распечатать текущие значения этих переменных, используйте команду SHOW:

SQL> SHOW PAGESIZE
pagesize 14
SQL> SHOW NEWPAGE
newpage 1
SQL> SHOW LINESIZE
linesize 80




























                                    -- 58 --



     Сохранение и Печать Результатов Запроса

   С помощью команды SQL*PLUS SPOOL, Вы можете сохранить результаты запроса в
файле или распечатать их на принтере.

     Сохранение pезультатов в файл
  Чтобы сохранить результаты запроса в файле- и напечатать их фоpме на экране
- введите команду SPOOL в следующей форме:

   SPOOL имя_файла

SQL*PLUS сохранит всю информацию, которая будет выводиться после команды
SPOOL, в указанный вами файл.

Если вы не указали расширения в имени файла, SPOOL добавит к имени файла
расширение по умолчанию, чтобы указать, что это файл вывода. Это расширение
зависит от ОС; обычно оно имеет имя LST или LIS.  Более подробно это
описывается в руководстве по инсталяции ORACLE.

SQL*PLUS продолжает записывать информацию в файл, пока вы не выключите запись
в файл, используя SPOOL в следующей форме:

   SPOOL OFF

Посылайте результаты ваших запросов в файл, когда вы захотите отредактировать
их текстовым процессором до печати, или включить их в письмо, докладную
записку, или друго документ.

     Печать результатов на принтере
     Чтобы распечатать результаты запроса, запишите их в файл как описано в
предыдущей части. Затем, вместо использования SPOOL OFF, введите команду в
следующе форме:

     SPOOL OUT

SQL*PLUS закончит буфферизацию и скопирует
содержимое буфферного файла на ваш принтер. SPOOL
OUT напечатает, но не уничтожит буфферный файл
после печати.


     Пример 4-24
     Печать результатов  на принтере
  Чтобы сгенерировать окончательный отчет и записать его в буфферный файл и
напечатать результаты, создайте командный файл с именем EMPRT.

Сначала, используйте EDIT для создания командного файла вашим системным
редактором. (Не используйте INPUT и SAVE, или SQL*PLUS добавит наклонную
черту в конец файла, и командный файл будет выполняться дважды).

SQL> EDIT EMPRT

Затем, введите следующие команды в командный файл, исользуя текстовый
редактор:





                                    -- 59 --



SPOOL TEMP
CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES


COLUMN DEPTNO HEADING DEPARTMENT
COLUMN ENAME HEADING EMPLOYEE
COLUMN SAL HEADING SALARY FORMAT $99,999

BREAK ON DEPTNO SKIP 1 REPORT
COMPUTE SUM OF SAL ON DEPTNO
COMPUTE SUM OF SAL ON REPORT

SET PAGESIZE 21
SET NEWPAGE 0
SET LINESIZE 30

TTITLE CENTER 'A C M E  W I D G E T' SKIP 2 -
LEFT 'EMPLOYEE REPORT' RIGHT 'PAGE:' -
FORMAT 999 SQL.PNO SKIP 2

BTITLE CENTER 'COMPANY CONFIDENTIAL'

SELECT DEPTNO, ENAME, SAL
FROM EMP
ORDER BY DEPTNO;

SPOOL OUT

Если вам необходимо отключить вывод на экран, необходимо добавить команды SET
TERMOUT OFF в начало файла и SET TERMOUT ON в конец. Сохраните файл (Вы
автоматически возвратитесь в SQL*PLUS).  Сейчас выполним командный файл
EMPRT:

SQL> @EMPRT

SQL*PLUS выведет следующие результаты на экран (без установки TERMOUT в OFF),
и в буфферный файл TEMP, и пошлет содержимое файла TEMP на ваш принтер по
умолчанию:

     A C M E  W I D G E T

EMPLOYEE REPORT      PAGE:   1

DEPARTMENT EMPLOYEE     SALARY
---------- ---------- --------
        10 CLARK        $2,450
           KING         $5,000
           MILLER       $1,300
**********            --------
sum                     $8,750

        20 SMITH          $800
           ADMAS        $1,100
           FORD         $3,000
           SCOTT        $3,000
           JONES        $2,975

                                    -- 60 --



**********            --------
sum                    $10,875

     COMPANY CONFIDENTIAL


     A C M E  W I D G E T

EMPLOYEE REPORT      PAGE:   2
DEPARTMENT EMPLOYEE     SALARY
---------- ---------- --------
        30 ALLEN        $1,600
           BLAKE        $2,850
           MARTIN       $1,250
           JAMES          $900
           TURNER       $1,500
           WARD         $1,250
**********            --------
sum                     $9,400
**********            --------
sum                    $29,025


     COMPANY CONFIDENTIAL



































                                    -- 61 --




     Глава 5       Доступ к Базе Данных

Данная глава объясняет, как осуществляется доступ к БД посредством SQL*PLUS,
и рассматривает следующие темы:
  *  подключение к БД по умолчанию
  *  подключение к удаленной БД
  *  копирование данных между различными БД
  *  копирование данных между таблицами одной БД

Читайте данную главу, сидя за компьютером, и проверяйте демонстрируемые
примеры. Перед тем, как начать, убедитесь, что Вы имеете доступ к
таблицам-примерам описанным в главе 1.


     Подключение к БД по умолчанию

Для доступа к данным существующей БД, сначала Вы должны подключиться к БД.
Когда Вы запускаете SQL*PLUS, Вы обычно подключаетесь к БД ORACLE по
умолчанию, с именем и паролем, которые Вы указываете во время запуска. Когда
Вы залогировались, вы можете подключиться к БД с другим именем пользователя
командой SQL*PLUS CONNECT. Эти имя и пароль д.б. правильными для данной БД.

Например, чтобы подключиться с именем TODD к БД по умолчанию, используя
пароль FOX, вы должны ввести:

SQL> CONNECT TODD/FOX

Если Вы опустили имя и пароль, SQL*PLUS попросит Вас их ввести. Вы также
можете ввести только имя и опустить пароль (SQL*PLUS выдаст подсказку для
ввода пароля). Так как SQL*PLUS сначала отключает Вас от БД, Вы можете
отключиться от БД, если вами указаны неправильные имя или пароль в команде
CONNECT.

Вы можете отсоединиться от ORACLE без выхода из SQL*PLUS, с помощью команды
DISCONNECT.


     Подключение к Удаленной БД

ORACLE может быть установлен на нескольких компьютерах. Такие компьютеры
часто объединябт в сеть, которая позволяет программам на разных ЭВМ быстро и
эффективно обмениваться данными. Сетевые компьютеры могут находиться рядом
или на больших расстояниях, и объединяться телекоммуникационными связями.

БД на других ЭВМ или другие БД на вашей рабочей ЭВМ (кроме БД по умолчанию)
называются удаленными БД (remote). Вы можете обращаться к удаленной БД, если
требуемая БД имеет SQL*NET и обе БД имеют совметимые сетевые драйверы.

К удаленной БД можно подключаться двумя способами:

  *  из SQL*PLUS, используя команду CONNECT
  *  во время запуска SQL*PLUS, используя команду SQL*PLUS

     Подключение к   удаленной БД  из SQL*PLUS
Чтобы подключиться к удаленной БД используя CONNECT, включите SQL*NET - специ-
фикацию БД в команду CONNECT в следующей форме (имя и пароль, вводимые Вами,
должны быть правильными для удаленной БД):

                                    -- 62 --



  *  CONNECT SCOTT@спецификация_БД
  *  CONNECT SCOTT/TIGER@спецификация_БД

SQL*PLUS, если необходимо, попросит Вас ввести имя и пароль, и подключится к 
указанной БД. Данная БД становится базой по умолчанию, пока вы не подключитесь
к другой БД, либо не отключитесь (DISCONNECT), или не покинете SQL*PLUS.

Когда Вы подключаетесь к удаленной БД данным способом, Вы можете использовать 
полный набор команд SQL*PLUS, SQL и блоков PL/SQL. Строка, которую вы вводите 
как спецификацию БД, зависит от протокола SQL*NET на вашем компьютере. За 
более подробной информацией обратитесь к главе 6 и к соответсвющему 
руководству SQL*NET для вашего протокола, или спросите вашего администратора.

     Подключение к SQL*PLUS удаленной БД
  Чтобы подключится к удаленной БД во время запуска SQL*PLUS, во время запуска
включите SQL*NET-спецификацию БД в команду SQLPLUS в одном из следующих
форматов:
  *  SQLPLUS SCOTT@спецификация_БД
  *  SQLPLUS SCOTT/TIGER@спецификация_БД

Вы должны указать допустимые имя и пароль пользователя удаленной БД и подста-
вить соответсвующую спецификацию удаленной БД. Если необходимо, SQL*PLUS попро
сит вас ввести имя и пароль, стартует SQL*PLUS, и подключит вас к указанной 
БД. Данная БД становится базой по умолчанию, пока вы не подключитесь к другой 
БД, либо не отключитесь (DISCONNECT), или не покинете SQL*PLUS.

И снова, Вы можете непосредственно манипулировать таблицами на удаленной БД
после подключения к БД данным способом.


     Копирование Данных из одной БД в другую

Используйте команду COPY для копирования данных между БД и между таблицами
одной БД. С помощью команды COPY Вы можете копировать данные между БД
следующимим способами:
  *  копировать данные с удаленной БД в вашу локальную БД
  *  копировать данные с локальной (по умолчанию) БД в удаленную БД
  *  копировать данные с удаленной БД в другую удаленную БД

     Пояснение синтаксиса
     команды COPY
Вы должны использовать команду COPY в следующем формате:

COPY FROM database TO database action -
destination_table (column_name, column_name, ...)
-
USING query

Вот пример команды COPY:

COPY FROM SCOTT/TIGER@D:BOSTON-MFG -
TO TODD/FOX@D:CHICAGO-SALES -
CREATE NEWDEPT (DNUMBER, DNAME, CITY)-
USING SELECT * FROM DEPT

Чтобы указать БД во фразе FROM или TO, вы должны иметь правильные имя и пароль
пользователя для локальной и удаленной БД и знать соответствующие спецификации
БД.  В позиции спецификации БД Вы также можете использовать имя связи с БД. 

                                    -- 63 --



COPY соблюдает безопасность ORACLE, поэтому имя пользователя, которое вы 
указываете, должно иметь доступ к таблицам. За информацией о доступных БД 
обращайтесь к администратору БД.

Когда вы копируете в локальную БД из удаленной БД, вы можете опустить фразу
TO. Когда вы копируете в удаленную БД с локальной БД, вы можете опустить
фразу FROM. Когда вы копируете данные между удаленными БД, вы должны указать
обе фразы.

Команда COPY ведет себя по разному, в зависимости от существования таблицы
назначения и от фразы действие (action), которые вы задали (CREATE в
предыдущем примере). Смотри "Уравление Обращением к целевым таблицам" ниже в
данной главе.  По умолчанию, копируемые столбцы имеют те же имена в целевой
таблице, которые они имеют в таблице-источнике. Если вы хотите присвоить им
другие имена, укажите новые имена в круглых скобках после имени целевой
таблицы.

Во фразе USING используется запрос, в котором указываются таблица-источник и
копируемые данные в целевую таблицу. Вы можете использовать различные формы
команды SELECT для выбора данных, которые будут копироваться командой COPY.

Вот пример команды COPY, которая копирует только две колонки из исходной
таблицы, и копируются только записи с полем DEPTNO равным 30:

SQL> COPY FROM SCOTT/TIGER@D:BOSTON-MFG -
> REPLACE EMPCOPY2 -
> USING SELECT ENAME, SAL -
> FROM EMPCOPY
> WHERE DEPTNO = 30

     Управление Обращением к Таблице назначения
Вы управляете обращением к таблице назначения посредством ввода от одной до
четырех управляющих фраз-REPLACE,CREATE, INSERT, или APPEND.

Фраза REPLACE указывает таблицу, которую необходимо создать в целевой базе
данных, и специфицирует следующие действия:

  *  Если целевая таблица уже существует, COPY удаляет существующую таблицу и
     замещает ее таблицей содержащей копируемые данные.
  *  Если целевая таблица не существует, COPY создает ее используя копируемые
     данные.

Вы можете использовать фразу CREATE, чтобы избежать записи данных в уже
существующую таблицу.  CREATE указывает следующие действия:

  *  Если целевая таблица уже существует, COPY сообщает об ошибке и
     останавливает выполнение команды.

  *  Если целевая таблица не существует, COPY создает таблицу используя
     копируемые данные.

Используйте INSERT для помещения данных в уже существующую таблицу. INSERT
определяет следующие действия:

    *  Если целевая таблица уже существует, COPY вставляет копируемые  данные
       в целевую таблицу.



                                    -- 64 --



    *  Если целевая таблица не существует, COPY сообщает об ошибке и
       останавливает выполнение команды.

Используйте APPEND, когда вы хотите вставить данные в существующую таблицу,
или создать новую таблицу, если целевая таблица не существует.  APPEND
определяет следующие действия:

    *  Если целевая таблица уже существует, COPY вставляет копируемые  данные
       в целевую таблицу.

    *  Если целевая таблица не существует, COPY создает таблицу, и затем
       помещает копируемые данные в нее.


      Пример 5-1
Копирование из Удаленной БД в Локальную БД

  Чтобы скопировать EMP из удаленной БД в таблицу EMPCOPY в вашу БД, введите
следующую команду.

Замечание:  Спросите у ДБА соответсвующие имя, пароль и используя CREATE
           спецификацию для удаленного компьютера, который содержит копию EMP.

SQL> COPY FROM SCOTT/TIGER@D:BOSTON-MFG -
> CREATE EMPCOPY -
> USING SELECT * FROM EMP

SQL*PLUS покажет следующие результаты:

Array fetch/bind size is 20. (arraysize is 20)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)

Затем SQL*PLUS создаст таблицу EMPCOPY, скопирует записи, и выведет следующее
вспомогательное сообщение:

Table EMPCOPY created.

   14 rows selected from SCOTT/TIGER@D:BOSTON-MFG.
   14 rows inserted into EMPCOPY.
   14 rows committed into EMPCOPY at DEFAULT HOST
connection

В данной команде COPY, фраза FROM приказывает COPY подсоединиться к БД со
спецификацией D:BOSTON-MFG как пользователю SCOTT с паролем TIGER.

Заметим, что точка с запятой в конце команды необязательна; COPY - это команда
SQL*PLUS, а не команда SQL, даже хотя она и содержит запрос. Так как большинсT
во команд COPY длинее чем одна строка, вы должны использовать знак переноса(-)

     Интерпретация  COPY
Первые три сообщения команды COPY показывают значения сообщений команды
переменных команды SET, влияющих на операцию копирования.  Наиболее важная из
них- LONG, которая ограничивает длину значений колонок типа LONG.
(LONG- это тип данных подобный CHAR). Если целевая таблица содержит колонку
LONG, COPY обрежет значение этой колонки согласно значению системной
переменной LONG.


                                    -- 65 --



Переменная ARRAYSIZE ограничивает количество записей выбираемых SQL*PLUS-ом
из БД за один раз.  Это количество записей составляет пакет (batch).
Переменная COPYCOMMIT устанавливает количество пакетов, после которых COPY
сделает изменения в БД. (Если вы установили COPYCOMMIT в ноль, COPY сделает
изменения в БД после того, как все пакеты скопируются). Подробнее смотри в
главе 6.

После печати трех системных переменных и их значений, COPY сообщит вам, если
таблица была уничтожена, создана, или изменена во время выполнения
копирования. Затем COPY напечатает количество выбранных, вставленных, и
обработанных записей.

     Определение таблиц  других пользователей
Вы можете ссылаться на таблицы других пользователей в команде COPY, указав
имя таблицы и имя пользователя.

Например, чтобы произвести локальное копирование таблицы DEPT, пользователя
ADAMS в БД D:BOSTON-MFG, вы должны ввести:

SQL> COPY FROM SCOTT/TIGER@D:BOSTON-MFG -
> CREATE EMPCOPY2 -
> USING SELECT * FROM ADAMS.DEPT

Конечно, вы можете получить тотже результат командой COPY, присоединившись к
удаленной БД как ADAMS. Но для этого вам необходимо знать пароль пользователя
ADAMS.

     Копирование данных между таблицами одной БД

Вы можете копировать данные из одной таблицы в другую в одной БД (локальной
или удаленной). При копировании в локальной базе задайте ваше собственное имя
и пароль и спецификацию вашей локальной базы или во фразе FROM или в TO
(опустив другую фразу):

SQL> COPY FROM SCOTT/TIGER@D:MYDATABASE -
> INSERT EMPCOPY2 -
> USING SELECT * FROM EMP

При копировании в удаленной БД включите одинаковые имена, пароль, и
спецификацию БД во фразы FROM и TO:

SQL> COPY FROM SCOTT/TIGER@D:BOSTON-MFG -
> TO SCOTT/TIGER@D:BOSTON-MFG -
> INSERT EMPCOPY2 -
> USING SELECT * FROM EMP














                                    -- 66 --
