Типи DISTINCT

Мова SQL підтримує два різновиди визначаються користувачем типів – типи DISTINCT та структуровані типи обидва ці типи определяются13 за допомогою оператора CREATE TYPE розглядаються в цьому підрозділі, а структуровані типи – наступного (ключове слово DISTINCT записано тут прописними буквами, щоб підкреслити, що дане слово не використовується в цьому контексті у своєму звичайному природному мовному сенсі – як різний) Нижче наведено визначення SQL для типу WEIGHT типу DISTINCT (порівняйте і зіставте всілякі визначення для цього типу на мовою Tutorial D в розділі 54)

CREATE TYPE WEIGHT AS DECIMAL (5,1) FINAL

У своїй найпростішої формі (тобто якщо не розглядаються різні необовязкові специфікації) це визначення має наступний синтаксис

12 Тут передбачається, що до одного з порівнюваних операндів застосовується операція доповнення ня пробілами PAD SPACE [420]

13 Цей оператор підтримує також якісь конструкції, звані в даному контексті доменами, але домени SQL не мають нічого спільного з доменами в реляційному сенсі Домени SQL докладно розглядаються в [420]

CREATE TYPE &lttype name&gt AS &ltrepresentation&gt FINAL

Нижче наведені додаткові відомості по цій темі

1 Обовязкова специфікація FINAL розглядається в розділі 20

2 Параметр &ltrepresentation&gt являє собою імя іншого типу (і цей рас сматривать тип не має бути визначений користувачем або згенерований) Зокрема, слід зазначити, що з урахуванням цих правил, що стосуються застосування параметра &ltrepresentation&gt, ми не могли б визначити тип POINT з розділу

53 як тип DISTINCT мови SQL

3 Слід також враховувати, що параметр &ltrepresentation&gt задає не можливе уявлення, як було описано вище в цьому розділі, а скоріше фактичне физи тичне уявлення розглянутого типу DISTINCT Насправді, мова SQL взагалі не підтримує поняття можливого подання possrep. Одним з наслідків такого упущення є те, що неможливо визначити тип DISTINCT (або структурований тип, коли мова піде про нього) за допомогою двох або декількох окремих можливих уявлень

4 У мові SQL немає ніяких конструкцій, аналогічних специфікації CONSTRAINT мови Tutorial D Наприклад, у випадку типу WEIGHT не існує способу, позво ляющего вказати, що для кожного значення WEIGHT відповідне значення DECIMAL (5, 1) має бути більше нуля (щоб вага не міг стати отрицатель вим) Або, скажімо, менше 5000

5 Застосовні до типу DISTINCT оператори порівняння визначаються саме як такі оператори, які можуть застосовуватися до відповідної фізичної поданням

Примітка Якщо не вважати оператора привласнення (див пункт 8), інші оператори, застосовні до фізичного поданням, не можуть застосовуватися до типу DISTINCT Наприклад, жодне з наступних виразів не є допустимим, навіть якщо WT відноситься до типу WEIGHT

WT   +

14 7 WT   *

2 WT   + WT

6 Селектори та оператори ТНЕ_ підтримуються Наприклад, якщо NW-змінна базової мови типу DECIMAL (5, 1), то вираз WEIGHT (: NW) повертає відповідне значення ваги, а якщо WT – стовпець типу WEIGHT, то вираз DECIMAL (WT) возвращает14 відповідне значення DECIMAL (5,1) Тому наступні операції SQL є допустимими

14 Фактично в синтаксисі, який визначений в специфікації SQL: 1999, вираз DECIMAL (WT) не є допустимим, але передбачається, що воно стане допустимим в специфікації SQL: 2003 Однак слід відзначити, що (на відміну від операторів ТНЕ_ мови Tutorial D) його не можна буде використовувати як псевдопеременной

DELETE FROM P WHERE WEIGHT = WEIGHT ( 147 )

EXEC SQL DELETE FROM P WHERE WEIGHT

= WEIGHT ( :NW )

EXEC SQL DECLARE Z CURSOR FOR

SELECT DECIMAL ( WEIGHT ) AS DWT FROM P

WHERE WEIGHT &gt WEIGHT ( :NW )

7 За одним важливим винятком (див пункт 8), до типів DISTINCT застосовуються правила суворої типізації Необхідно звернути особливу увагу на те, що операції порівняння значень типу DISTINCT і значень типу, що лежить в основі представлення типу DISTINCT, є неприпустимими Тому наступні оператори SQL не рахуються припустимими, навіть незважаючи на те, що змінна NW (як і колись) відноситься до типу DE CIMAL (5,1)

DELETE FROM P WHERE  WEIGHT   =     147                                                                                                                           /*                                        Застереження:

неприпустимий оператор * /

EXEC SQL DELETE FROM P WHERE WEIGHT =: NW / * Застереження:

неприпустимий оператор * /

EXEC  SQL DECLARE  Z  CURSOR FOR

SELECT DECIMAL  (  WEIGHT  )  AS  DWT FROM P

WHERE WEIGHT> : NW / * Застереження: неприпустимий оператор * /

8 Виняток, згадане в пункті 7, стосується операцій привласнення Наприклад, якщо потрібно виконати вибірку деякого значення WEIGHT У визначену змінну типу DECIMAL (5, 1), то має бути виконано перетворення типів Безумовно, що таке перетворення може бути виконано явно, як показано нижче

SELECT DECIMAL ( WEIGHT ) AS DWT INTO :NW

FROM P

WHERE P# = P# (P1)

Але наступний оператор також є допустимим (і при його виконанні відбувається відповідне приведення типу)

SELECT WEIGHT INTO :NW

FROM P

WHERE P# = P# (P1)

Аналогічні зауваження відносяться до операцій INSERT і UPDATE

9 Для перетворення в типи, з типів або між типами DISTINCT можуть бути також явно визначені оператори CAST Детальні відомості про це тут не розглядаються

10 У разі необхідності можуть бути визначені додаткові оператори (а в подальшому вони можуть бути знищені)

Примітка У мові SQL оператори називаються програмними модулями і поділяються на три типи: функції, процедури та методи (Функції та процедури можуть розглядатися певною мірою як аналогічні описаним вище операторам, призначеним тільки для читання, і операторам поновлення, відповідно методи діють подібно до функцій, але визиваются15 з використанням іншого синтаксичного стилю) Тому ми можемо визначити функцію (по суті представляє собою поліморфну ​​функцію), звану ADDWT (скорочення від add weight – додавання ваг), яка дозволяє складати два значення незалежно від того, чи є вони значеннями типу WEIGHT, або значеннями типу DECIMAL (5, 1), або поєднанням того й іншого У такому випадку всі наведені нижче вирази стають допустимими

ADDWT ( WT, 147 )

ADDWT ( 147, WT )

ADDWT ( WT, WT ) ADDWT ( 147, 30 )

Додаткову інформацію, що стосується програмних модулів SQL, можна знайти в [420] і [428] Більш докладні відомості про них виходять за рамки даної книги

11 Для знищення визначається користувачем типу використовується наступний оператор

DROP TYPE  &lttype name&gt  &ltbehavior&gt   

Тут параметр &ltbehavior&gt з позначенням способу виконання може мати значення RESTRICT АБО CASCADE неформально RESTRICT означає, що операція DROP повинна закінчитися невдачею, якщо даний тип в даний час де-небудь використовується в базі даних, а ключове слово CASCADE означає, що операція DROP завжди закінчується успішно і викликає неявне застосування операцій DROP CASCADE до всіх обєктів, в яких в даний час використовується цей тип (саме так)

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*