ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.





   ГЛАВА 3                     


   ЭЛЕМЕНТЫ ЯЗЫКА SQL          


Эта глава содержит справочную информацию об основных элемен-
тах языка SQL.  Понимание этих элементов имеет решающее зна-
чение для эффективного использования SQL.  Перед использова-
нием  любого  оператора,  представленного  в   Главе   5   -
"Справочник  операторов SQL",  необходимо хорошо понять кон-
цепции, излагаемые в этой главе. Данная глава описывает сле-
дующие разделы:

          * объекты базы данных
          * правила именования объектов базы данных
          * зарезервированные слова
          * литералы
          * переменные
          * типы данных
          * значения null
          * псевдостолбцы


         Объекты базы данных                           

Объекты базы  данных  - это элементы,  поддерживаемые ORACLE RDBMS. 
Большинство объектов занимает память в  базе  данных; некоторые объекты  
(например  -  табличные пространства) ис- пользуются для хранения других 
объектов базы данных. Таблицы - это единственный объект, который хранит данные 
пользовате- ля и к которому он может обращаться непосредственно.

Объекты базы данных при создании получают имена, которые подчиняются правилам 
именования,  описанным в следующем разделе. Все объекты базы данных имеют 
создателя  и  владельца; обычно создатель  и владелец объекта является одним и 
тем же лицом. Ниже перечислены объекты, которые должны именоваться:  * 
   кластеры * столбцы *  ограничения * базы данных * связи базы данных * 
   индексы * сегменты отката * точки сохранения * последовательности * 
   синонимы * таблицы * табличные пространства * пользователи * обзоры

         Правила именования объектов базы              

Именование объектов базы данных подчиняется следующим правилам:

1. Имя  объекта  базы  данных  должно быть длиной от 1 до 30
   символов (кроме имен объектов,  ограниченных восемью символами).
2. Имя не должно содержать кавычек.
3. Имя не является регистрочувствительным
4. Имя должно начинаться с буквы.
5. Имя может содержать только символы A-Z, 0-9, _,$ и # (использование $ и # 
   специально оговаривается).
6. Имя  не должно дублировать зарезервированные слова ORACLE (перечислены в 
   следующем разделе).
7. Имя  не  должно дублировать имя какого-либо иного объекта базы данных,  
   владельцем которого является тот же пользователь.
8. (индексы, последовательности, таблицы и обзоры). Некоторые объекты базы  

                                    -- 28 --



   данных могут в дальнейшем определяться вместе с именем пользователя - 
   владельца данного объекта.  Например, кроме  имени EMP  Вы  можете 
   использовать  имя SCOTT.EMP. Вы можете также включать пробеля справа и 
   слева от точки, но они не относятся к соглашениям.
9. Имя может содержать любую комбинацию символов и  в случае заключения в  
   кавычки  правила 3-6 не действуют.  (в этом случае имя может также 
   содержать и пробел).

Алиасы таблиц и столбцов, хотя и не являются объектами базы, должны 
следовать указанным правилам.
Примеры идентификаторов:

ENAME
HORSE
SCOTT.hiredate
"SELECT"
"EVEN THIS & THAT!"
A_VERY_VERY_VERY_LONG_NAME


         Указания по именованию объектов базы данных   

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

Давая имена  объектам базы данных Вы должны уравновесить два tребования:
сделать имя как можно короче (для простоты использования) и осмысленным  (для  
облегчения понимания).  В случае сомнений на этот счет  необходимо  выбирать  
простоту понимания, так как  большинство систем используется многими людьми в 
течение многих лет.  Ваш двойник через  десять  лет может затратить много 
времени, чтобы понять систему, если Вы поименовали объект PMDD вместо 
PAYMENT_DUE_DATE.

Существует соглашение по именованию  в  единственном  числе, например  -  
используйте название EMPLOYEE вместо EMPLOYEES.  Или можно выбрать обратный 
вариант и использовать везде  множественную форму.  Цель таких именований - 
упростить понимание назначения таблицы без ее просмотра.

Использование согласованных правил именования поможет  пользователям проще 
понять назначение таблиц в Вашем приложении.  Одним из таких правил может быть 
назначение  всем  таблицам, относящимся к системе FINANCE, префикса FIN_.

Необходимо использовать  в  разных таблицах одинаковые имена для столбцов с 
однотипными данными.  Например, как в таблице EMP, так и DEPT столбец с именем 
отдела называется DEPTNO.


         Зарезервированные слова                       

Приведенные ниже слова резервируются в SQL. Их нельзя использовать в  качестве 
имен объектов базы данных (если не заключать их в кавычки).



                                    -- 29 --



Слова, отмеченные звездочкой (*),  также являются зарезервированными  словами 
ANSI.  Слова,  помеченные знаком плюс (+) впервые появились в ORACLE RDBMS 
Version 6.

          ACCESS             DEFAULT*            INDEX
          ADD                DELETE*             INITIAL
          ALL*               DESC*               INSERT*
          ALTER*             DISTINCT*           INTEGER*
          AND*               DROP                INTERSECT
          ANY*                                   INTO*
          AS*                ELSE+               IS*
          ASC*               EXCLUSIVE
          AUDIT              EXISTS*             LEVEL
                                                 LIKE
          BETWEEN*           FILE                LOCK
          BT*                FLOAT*              LONG
                             FOR*
          CHAR*              FROM*               MAXEXTEMNS
          CHECK*                                 MINUS
          CLUSTER            GRANT*              MODE
          COLUMN+            GRAPHIC             MODIFY*
          COMMENT            GROUP*
          COMPRESS                               NOAUDIT
          CONNECT            HAVING*             NOCOMPRESS
          CREATE*                                NOT
          CURRENT*           IDENTIFIED          NOWAIT
                             IF+                 NULL*
          DATE               IMMEDIATE*          NUMBER
          DBA                IN*
          DECIMAL*           INCREMENT           OF*+

          OFFLINE+           ROWNUM              UID
          ON*                ROWS                UNION*
          ONLINE+                                UNIQUE*
          OPTION*            SELECT*             UPDATE*
          OR*                SESSION*            USER
          ORDER*             SET*+
                             SHARE               VALIDATE
          PCTFREE            SIZE                VALUES*
          PRIOR              SMALLINT*           VARCHAR*
          PRIVILEGES*        START+              VARGRAPHIC
          PUBLIC*            SUCCSESSFUL         VIEW*
                             SYNONYM
          RAW                SYSDATE             WHENEVER*+
          RENAME                                 WHERE*
          RESOURCE           TABLE*              WITH*
          REVOKE*            THEN+
          ROW                TO*
          ROWID              TRIGGER+


         Ключевые слова                                

Следующие ключевые слова имеют специальное значение  в языке SQL, поддержива-
емом ORACLE RDBMS,  но не являются зарезервированными словами и, следовательно,
могут быть идентификаторами.  Однако эти слова могут стать зарезервированными 
в будущем. Зарезервированные слова  ANSI  отмечены звездочкой (*); ключевые 
слова, впервые добавленные в версии 6, отмечены плюсом (+).

                                    -- 30 --



          ARCHIVELOG+        ESCAPE*+            MAXVALUE+
          AUTHORIZATION*+    EVENTS+             MINEXTENTS+
                             EXEC*+              MINVALUE+
          BACKUP+                                MODULE*+
          BEGIN*+            FETCH*+             MOUNT+
                             FOREIGN*+
          CACHE+             FORTRAN*+           NEXT*+
          CHARACTER*+        FOUND*+             NOARCHIVELOG+
          CLOSE*+                                NOCACHE+
          COBOL*+            GO*+                NOCYCLE+
          COMMIT*+           GOTO*+              NOMAXVALUE+
          CONSTRAINT*+                           NOMINVALUE+
          CONTENTS+          INCLUDING+          NOORDER+
          CONTINUE*+         INDICATOR*+         NORMAL+
          CONTROLFILE+       INITRANS+           NOSORT+
          CRASH              INT*+               NUMERIC*+
          CURSOR*+
          CYCLE+             KEY*+               ONLY*+
                                                 OPEN*+
          DATABASE           LANGUAGE*+
          DATAFILE+          LINK                PASCAL*+
          DEC*+              LOGFILE+            PCTINCREASE+
          DECLARE*+                              PCTUSED+
          DISMOUNT+          MAXDATAFILES+       PL1*+
          DOUBLE*+           MAXINSTANCES+       PRECISION*+
                             MAXLOGFILES+        PRIMARY*+
          END*+              MAXTRANS+           PROCEDURE*+

          READ*+             SEQUENCE+           TABLES+
          REAL*+             SHARED+             TABLESPACE+
          REFERENCES*+       SOME*+              TEMPORARY*+
          RELEASE+           SORT+               TRANSACTION*+
          RESETLOGS+         SPECIFIED+
          REUSE+             SQL*+               USING*+
          ROLLBACK*+         SQLCODE*+
                             SQLERROR*+          WRITE*+
          SAVEPOINT+         STATEMENT+          WORK*+
          SCHEMA*+           STORAGE+
          SECTION*+          SWITCH+
          SEGMENT+           SYSTEM*+


         Термины системы ORACLE                        

         Литералы                              

Термины: literal,  constant, value (литерал, константа, значение) в ORACLE 
имеют одинаковое  значение;  все  представляют определенную часть  информации.  
Например  -  'JACK',  'BLUE ISLAND', '101' - символьные литералы;  '01-JAN-89' 
- литерал типа дата; 5001 - цифровой литерал. Заметьте, что символьные и 
датные литералы заключены  в  одиночные  кавычки.  Кавычки позволяют ORACLE 
отличать имена объектов базы данных от символьных и датных литералов.

         Переменные                            





                                    -- 31 --



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


         Типы данных                                   

Каждый литерал  или переменная,  с которыми работает система ORACL, имеет 
определенный тип данных.  Тип данных ассоциируется с фиксированным набором 
свойств,  присущих его значениям. Этот набор свойств позволяет ORACLE 
различать типы  данных. Например  -  сложение  может выполняться с данными 
типa NUMBER, но не с данными RAW.

Типы данных также ограничивают  диапазон  значений,  которые может принимать  
элемент данных.  Например - тип данных DATE не может принимать значение 29 
февраля, если год не високосный. Этот  же  тип  данных не может принимать 
значение 2 или 'SHOE'.

Значение в базе данных предполагается того же  типа,  что  и тип столбца,  
которому оно принадлежит. Типы данных специфицируются в операторах ALTER 
TABLE,  CREATE CLUSTER и  CREATE TABLE. Каждому  столбцу таблицы назначается 
определенный тип данных, а следовательно - и каждому значению, принадлежащему 
данному столбцу.  ORACLE назначает тип данных небазовым значениям исходя из 
контекста их использования.  Например, если Вы вставляете  '01-JAN-89'  в  
столбец с типом DATE,  ORACLE после проверки на правильность будет  трактовать  
символьную строку '01-JAN-89' как значение типа DATE.


         Смешанные типы: преобразование типов данных   

В общем случае в выражении не  должно  быть  смешения  типов данных. Например 
- выражение не может содержать произведения 5 на 10 и затем сложения с ним 
'JAMES'.

Однако, ORACLE будет выполнять  преобразование  одного  типа данных в другой 
если это имеет смысл.  Например, литеральная строка '10' имеет тип CHAR,  
ORACLE преобразует ее в NUMBER, если она используется в числовом выражении.


         Типы данных CHAR и VARCHAR                    

Тип данных CHAR  используется  при  манипуляции  со  словами текста. Он имеет 
меньше ограничений,  чем другие типы данных и, следовательно,  имеет меньше 
свойств,  нежели другие типы данных. Например,  в  типе данных CHAR могут 
храниться любые формы текста, а в типе NUMBER - только числовые.

Данные хранятся в строках переменной длины в кодах ASCII или EBCDIC - в 
зависимости от используемого компьютера.  Использование нестандартных символов 
может  снизить  переносимость приложений между машинами разных архитектур.

В настоящее время типы данных CHAR и  VARCHAR  эквивалентны.  Эти типы данных 
предназначены для хранения символьных (алфа витно цифровых) данных.  Слова 
CHAR и VARCHAR можно использовать равнозначно, с одинаковым эффектом.





                                    -- 32 --



Абсолютный максимум числа символов,  которые можно хранить в столбце, 
определенном как CHAR и VARCHAR,  равен 255. Максимальное число  символов в 
конкретном столбце указывается при создании таблицы,  изменить его можно  с  
помощью  оператора ALTER TABLE.


        Столбцы CHAR и VARCHAR в словаре данных хранятся как VARCHAR.

В то  время как CHAR и VARCHAR в Версии 6 трактуются эквивалентно, ожидается,  
что в будущих версиях ORACLE RDBMS  CHAR будет фиксированной длины, а VARCHAR 
- переменной.


        Text                                          

Назначение     Специфицировать литерал типа "строка символов"
Предпосылки    нет

Синтаксис      '[char]...'

Ключевые слова  char           один из элементов символьного
и параметры                    набора (т.е. ASCII, EBCDIC),
                               специфицируемого параметром файла 
                               INIT.ORA - LANGUAGE.

Замечания по   Текстовый литерал должен быть длиной  до  255
использованию  символов. Он заключается в одиночные кавычки; сама кавычка 
               представляется внутри литерала двумя идущими подряд кавычками.

               Замечание: В  данном руководстве термины сим-
               вольный литерал и текстовый литерал использу-
               ются взаимообразно.

Примеры        'Hello'
               'ORACLE.dbs'
               'Jackie''s raincoat'
               'Happy Birthday, Tom!'
               '09-MAR-88'.

Связанные      Разделы "Integer" и "Number" ниже в этой гла-
разделы        ве; синтаксическое описание condition  и expr
               в Главе 4 - "Операторы и функции" данного документа.


        Тип данных NUMBER                             

Тип данных NUMBER используется для хранения чисел (с  фиксированной или 
плавающей точкой).  Могут храниться числа практически любого размера - 
точностью до 38 цифр. Храниться могут числа  от  1.0*10  в  (-129  степени)  
до  9.99*10 в 124 степени.

Для числового столбца можно специфицировать:

        * NUMBER
        * NUMBER с точностью (общее количество цифр в диапазоне от 1 до 38)
        * NUMBER с точностью  и масштабом (количество цифр после десятичной 
                 точки в диапазоне от -84 до 127)


                                    -- 33 --



Синтаксис данных типа NUMBER следующий:

        column_name NUMBER [ ( precision [,scale] ) ]

например:
        CREATE TABLE MINI (WEENUMBERS NUMBER (2,1))


        Использование масштаба и точности             

Числовые поля  хорошо специфицировать как общее число цифр и число десятичных 
позиций (после запятой).  Это позволяет выполнить на  входе  дополнительную  
проверку на целостность.  Спецификация максимального количества цифр, которые 
необходимо хранить, не требует, чтобы все числа были фиксированной длины. Если 
значение превышает максимальный  масштаб,  число будет округлено.  В следующей  
таблице даются примеры того, как данные будут запоминаться при различных 
значениях  масштаба.

Реальные данные          Специфицировано      Хранится
----------------------------------------------------------Д
7,456,123.89             NUMBER               7456123.89
7,456,123.89             NUMBER(9)            7456124
7,456,123.89             NUMBER(9,2)          7456123.89
7,456,123.89             NUMBER(9,1)          7456123.9
7,456,123.8              NUMBER(6)            точность превышена
7,456,123.8              NUMBER(15,1)         7456123.8
7,456,123.89             NUMBER(7,-2)         7456100
7,456,123.89             NUMBER(7,2)          точность превышена


        Отрицательный масштаб                         

Если масштаб  отрицательный,  реальные данные округляются до указанного числа 
позиций влево от десятичной  точки.  Например, спецификация (10,-2) означает 
округление до сотен.

        Масштаб больше точности                       

Хотя это используется и не часто,  не будет ошибкой указание масштаба больше 
точности. Если так, то точность специфицирует максимальное число значащих цифр 
после  десятичной точки.  Как и  везде с данными типа NUMBER,  если значение 
превышает максимальную точность,  выдается сообщение об ошибке, а если 
значение превышает  максимальный  масштаб,  оно округляется.  Например, если 
столбец определен как NUMBER(4,5),  он потребует в  качестве первой цифры 
после десятичной точки - ноль, и все цифры после точки, начиная с шестой, 
будут округляться.

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

Реальные данные          Специфицировано      Хранится
----------------------------------------------------------Д

.01234                   NUMBER(4,5)          .01234
.00012                   NUMBER(4,5)          .00012
.000127                  NUMBER(4,5)          .00013
.0000012                 NUMBER(2,7)          .0000012
.00000123                NUMBER(2,7)          .0000012


                                    -- 34 --




        Экспоненциальное представление                

Данные могут  быть  представлены  также и в экспоненциальном формате. Он 
выражается числом, далее следует буква "Е" и далее число от 1 до 128. 
Например, число 123456 представляется в виде 1.23456,  а 0.0987 - как 9.87. За 
точным определением в ORACLE чисел в экспоненциальном представлении обратитесь 
к разделу "NUMBER" этой главы.



        Подмножество FLOAT                            

ORACLE поддерживает концепцию числа с плавающей точкой с помощью типа данных 
FLOAT.  Этот тип данных согласовывается со стандартом ANSI для чисел с  
плавающей  точкой.  В  значении данных типа  FLOAT  позицию десятичной точки 
можно указать в любом месте от первой до последней цифры (или нигде).  Масштаб 
здесь  не  применяется  и Вы можете указать столько цифр после десятичной 
точки, сколько захотите (не превышая максимального значения точности).

FLOAT можно специфицировать как FLOAT, FLOAT(*), FLOAT(binary_precision).  
FLOAT  и  FLOAT(*)  эквивалентны  и представляют максимальную  точность  126 
двоичных цифр.  126 двоичных цифр примерно эквивалентны 37 десятичным цифрам.

Максимальную точность можно специфицировать с помощью синтаксиса 
FLOAT(binary_precision).  Чтобы преобразовать двоичную точность в десятичную, 
необходимо умножить двоичное значение на 0.30103. Чтобы преобразовать из 
десятичной точности в двоичную, умножьте десятичное значение на 3.32193.

        Другие формы NUMBER                           

Для совместимости с другими системами управления базами данных ORACLE 
поддерживает синтаксис широкого диапазона  числовых типов данных включая 
DECIMAL,  INTEGER, DOUBLE_PRECISION и REAL.  Все типы числовых данных реально 
запоминаются в одном и том же внутреннем формате ORACLE.  Дополнительные типы 
числовых форматов варьируются по точности и масштабу. Например, DECIMAL(5) 
подразумевает масштаб 0. Умалчиваемые значения для различных форм числовых  
данных  приводятся  ниже  в разделе "Сводка по числовым типам данных".


        Integer                                       

Назначение.....Специфицировать число   (целое).    Например,
               integer может представлять размер базы данных.
Предпосылки    Нет.

Синтаксис      [ + | - ]digit[digit]...[K|M]

Ключевые слова digit           одна из 0,1,2,3,4,5,6,7,8,9.
и параметры

Замечания по использованию  
Если за integer следует  "К",  действительное значение получается  умножением  
специфицированного числа на 1024. Если следует "М", значение получается  после  
умножения  числа  на 1048576. В общем случае  integer представляет байты; К  - 
означает килобайты и М - мегабайты. Однако нотацию "К" и "М" можно  
использовать везде,  где разрешено использование числовых выражений.


                                    -- 35 --



Максимально integer может хранить 38 цифр.
Примеры        7
               255
               29К
               6М

Связанные      Разделы "Integer" и "Number" ниже в этой гла-
разделы        ве; синтаксическое описание condition  и expr
               в Главе 4 - "Операторы и функции" данного документа.


        Number                                        

Назначение     Представление числового литерала.
Предпосылки    Нет.

Синтаксис      digit[digit...].[digit...][{exponent|multiplier}]

Ключевые слова digit           одна из 0,1,2,3,4,5,6,7,8,9.
и параметры
               exponent        {e|E}[+|-]digit[digit]...

               multiplier      К либо М. Обозначает число, на которое 
                               умножается данное К - 1024, М - 1048576.

Замечания по   Может использоваться  для  представления  как
использованию  целых,  так и действительных чисел. Экспонен-
               циальная  нотация  несовместима  с  указанием множителя.
               Множитель может указываться только для представления целых чисел
               Максимально number  может хранить 38 цифр.

Примеры        25
               6.34
               0.5
               7E2
               25e-03
               256K
               1M

Связанные      Разделы "Integer" и "Number" ниже в этой гла-
разделы        ве; синтаксическое описание condition  и expr
               в Главе 4 - "Операторы и функции" данного документа.


        Тип данных DATE                               

Тип данных  DATE используется для хранения информации о дате и времени.  Хотя 
информация о  дате  и  времени  может  быть представлена типами данных CHAR 
или NUMBER,  ORACLE ассоциирует с этим типом специальные свойства.

        Для каждого значения даты запоминается:
          * Век
          * Год
          * Месяц
          * День
          * Час
          * Минута
          * Секунда

                                    -- 36 --



Время запоминается в 24 - часовом формате. По умолчанию время в DATE имеет 
значение 12:00:00 a.m. (полночь) - если время не  указывается.  По  умолчанию  
дата  в  DATE  принимает значение первого дня текущего месяца.  Функция 
SYSDATE возвращает текущую дату и текущее время.

Стандартный формат ORACLE для типа  данных  DATE  DD-MON-YY, например -  
13-NOV-88.  Для  ввода  даты в нестандартном для ORACLE формате необходимо 
использовать функцию TO_DATE с соответствующей маской формата.

Для ввода  в  дату  времени необходимо также воспользоваться функцией TO_DATE, 
чья маска должна содержать указание времени, например:

INSERT INTO BIRTHDAYS (BNAME, BDAY)
    VALUES ('ANNIE',
       TO_DATE('13-NOV-85 10:56 A.M.','DD-MON-YY HH:MI A.M.')

Для сравнения дат,  имеющих в своем составе время, можно для игнорирования 
времени использовать функцию TRUNC.


        Арифметика дат                        

Хотя Вы и не можете умножать и делить одну дату на другую, к датам можно 
прибавлять или  вычитать  числовые  константы  и другие даты.  Например  
SYSDATE  +  1  означает "завтра",  а SYSDATE - 7 -  дату  на  неделю  раньше  
текущей.  Вычитание SYSDATE из столбца HIREDATE даст число дней,  которые 
служащий работает в данной организации.

ORACLE предлагает функции для многих операций с датами. Например, функция 
ADD_MONTHS  позволяет добавлять  или  вычитать месяцы из даты. Функция 
MONTHS_BETWEEN  возвращает количество месяцев между двумя датами;  дробная 
часть результата представляет из себя часть 31 - дневного месяца.  Более под-
робную информацию о функциях Вы сможете отыскать в Главе 4  "Операторы и 
функции".

Так как каждая дата содержит компоненту времени, большинство результатов 
операций с датами содержат дробную часть,  означающую часть дня. Например 1.5 
дней = 36 часов.


        Использование Юлианской даты                  

Юлианская дата - это число дней,  прошедших с 1 января  4712 года до нашей 
эры.  Юлианская дата означает последовательное датирование от общей точки.  
Реализация юлианской даты в системе ORACLE не имеет компоненты времени.  Для 
использования юлианской даты в функциях TO_CHAR и  TO_DATE применяется маска 
формата "J". Например:

        SELECT TO_CHAR(TO_DATE('01-JAN-89'),'J') FROM DUAL
вернет:
        2447528


        Тип данных LONG                               





                                    -- 37 --



Столбцы, определенные  как  LONG,  могут  хранить символьные строки переменной 
длины до 65535 символов.  Тип данных  LONG отличается от VARCHAR только 
размером хранимых строк.  Данные типа LONG могут  использоваться  для  
хранения  массивов символов и даже коротких документов.

В словаре  данных определения обзоров хранятся в столбцах с типом данных LONG. 
Столбцы типа LONG можно использовать:
          * в списках операторов SELECT
          * во фразах SET предложения UPDATE
          * в операторах INSERT


        Ограничение на использование данных LONG      

На данные  типа LONG накладываются некоторые ограничения.  В таблице может 
быть только один столбец типа LONG.  Кроме того, такие столбцы нельзя 
использовать:
          * в индексах
          * во фразах WHERE, GROUP BY, ORDER BY, CONNECT BY, DISTINCT
          * в функциях (таких как SUBSTR или INSTR)
          * в выражениях
          * в  списках  SELECT  блока запроса,  связанного с другим блоком 
            запроса с помощью  UNION, INTERSECT, MINUS
          * в распределенных запросах (хотя их можно исполь зовать в команде 
            SQL*Plus - COPY)


        Типы данных RAW и LONGRAW                     


Типы RAW  и  LONGRAW используются для байт - ориентированных данных (например 
- двоичные данные или  строки  байтов)  для хранения символьных  строк и 
последовательностей графических символов. ORACLE выдает данные типа RAW  в 
шестнадцатеричном виде. Данные  типа  RAW эквивалентны CHAR (а LONGRAW - LONG) 
за исключением того, что при передаче с помощью SQL*Net данные типа  CHAR  
будут  преобразовываться из ASCII в EBCDIC и обратно.

Данные типа RAW необходимо вводить в шестнадцатеричном виде.


        Типы данных DB2 и SQL/DS                      

Дополнительно к типам данных ORACLE SQL - операторы могут создавать таблицы  и  
кластеры,  воспринимающие  типы данных продуктов фирмы IBM: SQL/DS и DB2 и 
преобразовывать их в типы данных ORACLE следующим образом:

Тип данных SQL/DS или DB2             Тип данных ORACLE 
------------------------------------------------------------
SMALLINT                              NUMBER(38)
INTEGER                               NUMBER(38)
DECIMAL(m,n)                          NUMBER(m,n)
FLOAT                                 NUMBER
VARCHAR(n)                            CHAR(n)
LONG VARCHAR                          LONG





                                    -- 38 --



Из-за отсутствия в ORACLE соответствующего  типа  данных  не должны 
использоваться типы:
          * GRAPHIC
          * VARGRAPHIC
          * LONG VARGRAPHIC

Однако их  нельзя использовать для именования объектов базы, так как он 
являются зарезервированными словами SQL/DS.


        Тип данных ROWID                              

Это связанный с каждой строкой псевдостолбец,  который соответствует адресу 
строки.  Этот адрес может быть выбран SQL - оператором используя зарезервиро-
ванное слово ROWID.  Как показано в следующем примере,  запрос, выбирающий 
ROWID, возвращает в шестнадцатеричном виде значение адреса выбираемой строки:

SELECT ROWID, ENAME FROM EMP WHERE DEPTNO = 20

ROWID                ENAME
-------------------  ----------
0000000F.000.0002    SMITH
0000000F.003.0002    JONES
0000000F.007.0002    SCOTT
0000000F.00A.0002    ADAMS
0000000F.00C.0002    FORD

ROWID возвращает  три части информации,  необходимой для нахождения строки:
          * номер блока в файле базы данных
          * номер строки в блоке (первая строка 0)
          * номер файла базы данных (первый файл 1)


        Для чего используется ROWID ?                 

ROWID имеют несколько важных применений:
          * Это  наискорейший  метод  доступа к определенной строке.
          * Они могут использоваться,  чтобы посмотреть, как реально хранятся 
             строки таблицы.
          * Они являются уникальным идентификатором для строк в данной таблице

ROWID для строки остается  постоянным  на  протяжении  всего времени  жизни 
строки.  Однако Вы не должны трактовать ROWID как основной ключ,  так как он 
может меняться при удалении и повторном  добавлении  строки,  например - при 
использовании утилит Export/Import.  Более того,  после удаления некоторой 
строки ORACLE назначит этот ROWID вновь добавленной строке.

Хотя ROWID  и  могут  использоваться  во  фразах  SELECT или WHERE, они не 
запоминаются в базе данных  и,  следовательно, не являются изменяемыми 
данными. Другими словами - невозможно выполнить для ROWID операции UPDATE, 
INSERT или DELETE.


        Преобразование типов данных                   

Фразы WHERE и выражения (булевые,  арифметические или строчные) могут исполь-
зовать при сравнении данные различных типов.  В этих случаях для  выполнения   
оператора ORACLE обязательно использует  преобразование  данных.  В следующих 

                                    -- 39 --



примерах ORACLE автоматически выполнит необходимые  преобразования данных:
SELECT ENAME FROM EMP WHERE ENAME = 135
SELECT ENAME FROM EMP WHERE EMPNO = '7936'
SELECT ENAME FROM EMP WHERE HIREDATE = '12-MAR-86'
SELECT ENAME FROM EMP WHERE ROWID = '00002514.0001.0001'

Для выполнения преобразования ORACLE может:
          * преобразовать константу в тип данных столбца
          * преобразовать значение  столбца  к  типу  данных  константы
          * преобразовать тип данных столбца к  типу  данных
            другого столбца

Рисунок 3-1 показывает пользовательские функции, которые могут выполнять 
преобразование из одного типа данных в другой:

           К какому
                     CHAR         NUMBER          DATE
    Из какого   Ъ------------ДВ--------------В------------Дї
                і             і              і             і
       CHAR     і  не надо    і  TO_NUMBER   і  TO_DATE    і
                і             і              і             і
                Г------------ДЕ--------------Е------------Дґ
                і             і              і             і
       NUMBER   і   TO_CHAR   і  не надо     і  TO_DATE    і
                і             і              і             і
                Г------------ДЕ--------------Е------------Дґ
                і             і              і             і
       DATE     і   TO_CHAR   і    неверно   і    не надо  і
                і             і              і             і
                А------------ДБ--------------Б------------ДЩ
    Рисунок 3-1 Функции преобразования типов данных

Преобразования данных являются контекстно - зависимыми, поэтому нельзя 
ожидать,  что во всех случаях будет  выполняться тот же вид преобразования.  
Вместо того, чтобы полагаться на неявные или автоматические преобразования, 
необходимо указывать явные преобразования, обеспечиваемые функциями SQL. Это 
диктуется следующими соображениями:

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


        Правила сравнения типов данных                

Приведем список правил сравнения значений различных типов:
Числовые значения                             

Для положительных чисел сравнение обычное. Все отрицательные числа "меньше" 
положительных.  Таким образом: -1 меньше 100, а -100 меньше чем -1.

        Значения даты                                 


                                    -- 40 --



Более поздняя дата рассматривается "больше",  чем более ранняя. Например,  
'29-MAR-88'  "меньше"  чем   '05-JAN-89',   а '1:35pm' больше чем '10:09am'.

        Символьные значения                           

Значения сравниваются символ за символом, пока не обнаружится несовпадение.  
Какая строка имеет больший символ  в  этой позиции,  та и считается "больше". 
Если две строки одинаковы по всем символам более короткой  строки,  то  более  
длинная считается больше.

Символы сравниваются  в  соответствии с "последовательностью слияния" 
компьютера, на котором работает ORACLE. Один символ больше другого,  если  он  
находится после него в последовательности слияния.

Большинство компьютеров  используют  две  последовательности слияния, 
называемые   ASCII   (American  Standard  Code  for Information Interchange) и  
EBCDIC  (Extended  Binary  Coded Decimal Interchange  Code).  Они  
представлены  на следующих страницах.

Замечание: ORACLE использует последовательность слияния своего компьютера.  
Буквы верхнего и нижнего регистров не эквивалентны. В ASCII все буквы  нижнего  
регистра  больше  всех букв нижнего, для EBCDIC верно обратное.

В ASCII  символьные  литералы от '0' до '9' сортируются ниже алфавита, для 
EBCDIC также верно обратное.

В следующих двух таблицах приводятся последовательности сортировки для ASCII и 
EBCDIC.

        Последовательность сортировки ASCII           

            Десятичное                Десятичное
            значение     Символ       значение       Символ
            ----------------------------------------------Д
            32           пробел       59             ;
            33           !            60             <
            34           "            61             =
            35           #            62             >
            36           $            63             ?
            37           %            64             @
            38           &            65-90          A-Z
            39           '            91             [
            40           (            92
            41           )            93             ]
            42           *            94             ^
            43           +            95             _
            44           ,            96             `
            45           -            97-122         a-z
            46           .            123            {
            47           /            124            |
            48-57        0-9          125            }
            58           :            126            ~
            ----------------------------------------------Д


        Последовательность сортировки EBCDIC          



                                    -- 41 --



            Десятичное                Десятичное
            значение     Символ       значение       Символ
            ----------------------------------------------Д
            64           пробел       108            %
            74           (цент)       109            _
            75            .           110            >
            76            <           111            ?
            77            (           122            :
            78            +           123            #
            79            |           124            @
            80            &           125            '
            90            !           126            =
            91            $           127            "
            92            *           129-137        a-i
            93            )           145-153        j-r
            94            ;           162-169        s-z
            95            ї           193-201        A-I
            96            -           209-217        J-R
            97            /           226-233        S-Z
            107           ,           240-249        0-9
            ----------------------------------------------Д


        Сводка по типам данных                        

При создании таблицы Вы должны указать для  каждого  столбца тип данных,  
который  может в нем храниться.  SQL распознает типы данных, приведенные в 
следующей таблице. Если Вы введете неправильное  значение,  SQL выдаст 
сообщение об ошибке и выполнит для этого оператора ROLLBACK.
В следующем списке обобщаются  типы  данных  ORACLE.  Полное описание для  
каждого  типа  данных можно найти в предыдущих разделах.


          Тип данных          Описание        
          --------------------------------------------------
          CHAR(size)          Символьные данные   переменной длины; 
                              максимальный размер определяется значением size. 
                              Абсолютный максимум 255, умолча- ние 1 символ.
          CHARACTER           То же, что и CHAR.
          VARCHAR             То же, что и CHAR, но Вы должны специфицировать 
                              size. В будущих версиях  ORACLE  можно будет 
                              определять CHAR - фикси- рованная длина,  а  
                              VARCHAR  - переменная длина.
          DATE                Правильные даты в диапазоне от 1 января 4712  
                              года  до  нашей эры  до  31  декабря 4712 года 
                              нашей эры.  Умалчиваемая форма DD-MON-YY 
                              ('01-JAN-89').
          LONG                Символьные данные   переменной длины до   65535  
                              символов.  В таблице можно определить только 
                              один столбец такого типа.
          LONG VARCHAR        То же, что и LONG.
          RAW(size)           Необработанные двоичные данные длиной size 
                              байтов.  Size специфицировать обязательно.  
                              Абсолютный максимум 255 байтов.  Данные должны 
                              вводиться   в шестнадцатеричном представлении.
          LONG RAW            Необработанные двоичные данные в  остальном  
                              похожие на LONG.  Данные  должны   вводиться   в 
                              шестнадцатеричном  представлении.

                                    -- 42 --



          ROWID               Значение, которое    уникально идентифицирует 
                              строку в табли- це. Этот тип данных выбирается с 
                              помощью псевдостолбца ROWID и может  быть  
                              преобразован  в тип CHAR  с  помощью   функции 
                              ROWIDTOCHAR. Вы не можете сами создавать  в  
                              таблице  столбцы такого типа.


         Сводка по числовым типам данных                       

Если Вы специфицировали     Это запишется как ...     
------------------------------------------------------------
                         Тип       Точность    Масштаб
     NUMBER              NUMBER    38          null
     NUMBER(*)           NUMBER    38          null
     NUMBER(*,s)         NUMBER    38          s
     NUMBER(p)           NUMBER    p           0
     NUMBER(p,s)         NUMBER    p           s

     DECIMAL             NUMBER    38          0
     DECIMAL(*)          NUMBER    38          0
     DECIMAL(*,s)        NUMBER    38          s
     DECIMAL(p)          NUMBER    p           0
     DECIMAL(p,s)        NUMBER    p           s

     INTEGER             NUMBER    38          0
     SMALLINT            NUMBER    38          0

     FLOAT               NUMBER    38          null
     FLOAT(*)            NUMBER    38          null
     FLOAT(b)            NUMBER    b           null
     REAL                NUMBER    63          null
                                   binary (18 decimal)

     DOUBLE PRECISION    NUMBER    38          null


Диапазон "p" (десятичная точность) от 1 до 38.  Диапазон "s" (масштаб) от -84 
до 127. Диапазон "b" (двоичная точность) от 1 до 126.

DEC и  NUMERIC являются синонимами для DECIMAL,  а INT - для INTEGER.

Масштаб null подразумевает плавающую точку, а не-null - фиксированную точку.

За полным описанием взаимодействия точности и масштаба обратитесь к разделу 
данной главы "Тип данных NUMBER".


         Значения Null                                 

Если в определенном столбце строки данные отсутствуют, говорят что его 
значение null. Столбец с данными любого типа может содержать значение null,  
если только он  специально  не описан как NOT NULL в момент создания.

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



                                    -- 43 --



* не эквивалентно значению нуль
* будет превращать в null любое выражение.  Например NULL умноженное на 10 
  дает NULL.

Для временного преобразования null в действительное значение используется 
функция NVL. Например NVL(COMM,0) возвращает 0, если значение  в столбце COMM 
- null и действительное значение, если оно не null.

Большинство групповых функций игнорирует значения null. Например  запрос,  
вычисляющий среднее из пяти значений:  1000, NULL, NULL, NULL, 2000 возвратит 
1500, так как (1000+2000)/2 =1500.

Напрямую со  значениями null должны работать только операции сравнения (IS 
NULL или IS NOT NULL).  Если со значением null используется  любой другой 
оператор,  результат всегда неизвестный.  Так как NULL представляет собой 
отсутствие данных, он не может быть равен или не равен любому другому 
значению, кроме null.

ORACLE трактует условия, приводящие к неизвестному результату как FALSE.  
Например, если условие COMM = NULL всегда неизвестно, оператор SELECT с этим 
условием во фразе  WHERE не будет возвращать ни одной строки.  Заметьте, что в 
такой ситуации ORACLE не возвращает сообщение об ошибке.

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

Если А равно:         Сравнение             Результат 
--------------------------------------------------------
10                    A IS NULL             FALSE
10                    A IS NOT NULL         TRUE
NULL                  A IS NULL             TRUE
NULL                  A IS NOT NULL         FALSE
10                    A =NULL               неизвестный
10                    A !=NULL              неизвестный
NULL                  A =NULL               неизвестный
NULL                  A !=NULL              неизвестный


        Псевдостолбцы                                 

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

В следующей таблице приводится описание псевдостолбцов:

 Псевдостолбец          Возвращаемое значение   
 ----------------------------------------------------Д
 sequence_name. Возвращает текущее    значение
 CURRVAL        указанной последовательности.  Должно быть специфицировано 
                sequence_name.
 sequence_name. Возвращает  следующее значение
 NEXTVAL        указанной последовательности.  Должно быть специфицировано 
                sequence_name.
                За полным описанием последовательностей обратитесь к оператору 
                CREATE SEQUENCE в Главе 5 данного руководства ("Справоч- ник 
                по SQL - операторам").
 ROWID          Возвращает ROWID  для  строки.  За информацией о ROWID 
                обратитесь выше  к разделу "Тип данных ROWID".

                                    -- 44 --



 ROWNUM         Возвращает последовательный номер выдаваемой строки из таблицы 
                или объединения строк. Первая выбранная строка имеет ROWNUM 
                =1, вторая 2 и т.д. ROWNUM полезен главным образом для 
                ограничения  числа  строк, возвращаемых запросом (например - 
                WHERE ROWNUM < 10). Он может быть также использован для 
                назначения уникального значения каждой строке таблицы (UPDATE 
                table SET column =ROWNUM) ROWNUM  назначается, когда строка 
                возвращается и не влияет на порядок, назначаемый фразой ORDER 
                BY (т.е.  он назначает до упорядочения).

                Заметьте, что фраза WHERE ROWNUM > любого положительного числа  
                - никогда не вернет строк. Это получается, потому что ROWNUM 
                назначается для порядкового номера выдаваемой строки.  
                Например, первой выдаваемой строке  назначается ROWNUM = 1,  
                условие  WHERE ROWNUM > 1 дает FALSE и строка не высвечивается.
                Тогда вторая выбранная строка получит также ROWNUM  = 1 и тоже 
                не выдастся и, следовательно, не выдастся ни одной строки.

 LEVEL       Используется во  фразе CONNECT BY оператора SELECT; возвращает 1 
             для корневого узла, 2 для его  ребенка  и т.д.  Корневой узел 
             определяется как наивысший узел в инвертированном дереве.  Child 
             (ребенок) - любой не корневой узел.  Parent (родитель) - любая 
             строка,  имеющая child. Leaf (лист) - любая строка, не имеющая 
             child. Пример инвертированного дерева приведен на Рис.  3-2, а 
             замечания  по  использованию фразы LEVEL даются в Главе 6 этого 
             руководства  в  разделе "Фразы CONNECT BY и START WITH".

                           Ъ----------Дї
                           і root/     і                      Level  I
                 Ъ--------Дґ parent    Г--------Дї
                 і         А----------ДЩ         і
          Ъ------Б----ї                      Ъ--ДБ------Дї
          і parent/   і                      і  parent/  і
          і  child    і                      і   child   і           II
          АДВ------ДВДЩ                      АДВ------ДВДЩ
  Ъ--------ДБДї Ъ--ДБ------Дї         Ъ--------Б--ї  ЪДБ--------Дї
  і  child/   і і  parent/  і         і  child/   і  і  parent/  і
  і   leaf    і і   child   Г--Дї     і  leaf     і  і   child   і   III
  А----------ДЩ А--ДВ------ДЩ   і     А----------ДЩ  А----ДВ----ДЩ
                    і           і                          і
             Ъ------Б----ї Ъ----Б------ї             Ъ----ДБ----Дї
             і   child/  і і  child/   і             і  child/   і
             і   leaf    і і  leaf     і             і  leaf     і   IV
             А----------ДЩ А----------ДЩ             А----------ДЩ
                     Рисунок 3-2 Иерархическое дерево


KOAP Open Portal 2000