Генератори типів

У мові SQL підтримуються три генератора тіпов18 (у термінології SQL вони називаються конструкторами типів): REF, ROW і ARRAY У даній главі розглядаються тільки ROW і ARRAY, а опис REF відкладається до глави 26 Нижче наведено приклад, який ілюструє використання генератора типу рядка ROW

CREATE TABLE CUST

( CUST# CHAR(3),

ADDR ROW ( STREET CHAR(50), CITY CHAR(25)

, STATE CHAR(2), ZIP CHAR(5) )   PRIMARY KEY ( CUST# ) )

18 Існує ймовірність того, що у версії SQL: 2003 буде введено ще один генератор типу MULTISET

Тут STREET, CITY, STATE і ZIP-поля згенерованого строкового типу Загалом, такі поля можуть мати будь-який тип, включаючи інші рядкові типи У посиланнях на рівні поля використовується спосіб уточнення з допомогою точки, як у наступному прикладі (у ньому застосовується синтаксис <ехр>&lt field name&gt, де вираз <Ехр> повинно мати значення строкового типу)

SELECT CXCUST # FROM CUST AS CX WHERE CXADDRSTATE = СA;

Примітка Тут CX – імя кореляції Імена кореляцій детально розглядаються в розділі 8 (розділ 86), а поки просто відзначимо, що мова SQL вимагає використання явних імен кореляцій в посиланнях на імена полів для того, щоб можна було уникнути певної синтаксичної неоднозначності, яка могла б виникнути в іншому випадку

А нижче наведено приклад оператора INSERT

INSERT INTO CUST ( CUST#, ADDR )

VALUES ( 666 , ROW ( 1600 Pennsylvania Ave’, Washington, DC, 20500 ) )

Зверніть увагу на використання в даному прикладі литерала рядка (Фактично він мав би називатися літералом рядка і тому укладений у лапки, але формально в мові SQL немає такого поняття, як літерам рядки, і вираз, що застосовується в даному прикладі, являє собою конструктор значення рядка)

Нижче наведено ще один приклад

UPDATE CUST AS CX

SET CXADDRSTATE = TX

WHERE CUST# = 999

Примітка Фактично в стандарті в даний час не допускається оновлення на рівні поля, як у цьому прикладі, але це упущення можна вважати просто недоглядом, який обовязково повинен бути усунутий

Генератор типу ARRAY є багато в чому аналогічним Нижче наведений відповідний приклад

CREATE TABLE

ITEM_SALES ( ITEM# CHAR(5),

SALES INTEGER ARRAY [12], PRIMARY KEY ( ITEM# ) )

Типи, згенеровані за допомогою генератора типу ARRAY, завжди є одновимірними в якості заданого типу елемента (в даному прикладі INTEGER) можна використовувати все, що завгодно, крім ще одного типу массіва19 Припустимо, що а – значення деякого типу масиву У такому випадку а може містити будь-яку кількість п елементів (п> 0) аж до, але не більше зазначеної верхньої межі (в даному прикладі 12) Якщо а містить точно п елементів (п> 0), то цими елементами є саме а [1], а [2], ., А [п], ина них можна посилатися саме таким чином Вираз CARDINALITY (а) повертає значення п

Нижче наведені деякі приклади, в яких використовується таблиця ITEM_SALES Зверніть увагу на те, що в другому прикладі застосовується літерал масиву (або, скоріше, літерал масиву, в лапках, оскільки формально він називається конструктором значення масиву)

SELECT ITEM# FROM ITEM_SALES

WHERE SALES [3] &gt 10

INSERT INTO ITEM_SALES ( ITEM#, SALES

) VALUES ( X4320,

ARRAY t 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] )

UPDATE ITEM_SALES SET SALES [3] = 10 WHERE ITEM# = Z0564

Завершуємо цей розділ зауваженням, що до типів ROW і ARRAY застосовні оператори присвоювання і порівняння на рівність, за умови, що оператори присвоювання і порівняння на рівність застосовні до типів елементів розглянутого типу ROW АБО ARRAY якщо ж останні оператори не визначені, то не можна визначити і відповідні оператори для розглянутого типу ROW або ARRAY

55 РЕЗЮМЕ

У даній главі наведено всебічний опис важливого поняття типів даних (Званих також доменами або просто типами) Тип являє собою безліч значень, а саме, безліч всіх значень, які відповідають деякому обмеженню типу (Визначається в мові Tutorial D за допомогою конструкції POSSREP, що включає необовязкову специфікацію CONSTRAINT) Кожен тип має повязане з ним безліч операторів (До нього належать і оператори, призначені тільки для читання, і оператори оновлення), що дозволяють оперувати зі значеннями і змінними розглянутого типу Типи можуть бути як завгодно простими або

19 Існує ймовірність того, що це обмеження у версії SQL: 2003 буде знято У кожному разі, типом елемента може бути тип рядка, а цей тип рядка може включати поле деякого типу масиву Тому (Наприклад) нижче приведено допустимий визначення змінної

VX  ROW   (FX   INTEGER  ARRAY   [ 1 2 ] )   ARRAY   [12]

І в такому випадку (наприклад) VX [3] FX [5] посилається на пятий елемент масиву, який являє собою єдине значення поля в рядку, яка є третім елементом масиву, що представляє собою значення змінної VX

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

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

Типи можуть бути обумовленими системою або користувачем крім того, вони можуть

бути скалярними або нескалярнимі Скалярний тип не має компонентів, видимих ​​користувачеві (Найбільш важливими нескалярнимі типами в реляційної моделі є типи відносини, які розглядаються в наступному розділі) Автор прагне показати важлива відмінність між типом і його фізичним представленням (Типи ставляться до рівня моделі, а фізичні уявлення – до рівня реалізації) Але потрібно також, щоб кожен тип мав щонайменше одне оголошене можливе подання (Припустимо також наявність більше одного такого подання) Кожне подібне можливе подання викликає автоматичне визначення одного оператора селектора, а також визначення по одному оператору ТНЕ_ для кожного компонента цього можливого подання (включаючи псевдопеременную ТНЕ_) Автор підтримує ідею явного перетворення типів, але не підтримує неявні способи приведення типів Автор є також прихильником підходу, що передбачає визначення будь-якої кількості додаткових операторів для скалярних типів, і висуває вимогу, щоб для кожного типу був передбачений оператор порівняння на рівність і оператор присвоювання (Можливо, навіть множинного)

У даний главі розглядалися також генератори типів, що представляють собою оператори, які повертають типи (такі як ARRAY) Обмеження і оператори, застосовні до згенерованим типам, походять від універсальних обмежень і

операторів, які повязані з застосовним генератором типу

Нарешті, в цьому розділі були коротко описані засоби визначення типів мови SQL У мові SQL передбачено цілий ряд вбудованих типів, таких як BOOLEAN, INTEGER, DATE, TIME і тд (З кожним з яких, безумовно, повязано певне безліч операторів), але у звязку з цим типами підтримується лише обмежена форма суворої типізації Ця мова дозволяє також користувачам визначати свої власні

типи, які поділяються на типи DISTINCT І структуровані типи крім того, він підтримує деякі генератори типів (ARRAY і ROW, а також REF) У цій главі наведено аналіз всіх цих функціональних засобів SQL з точки зору тих ідей, які були представлені в ній вище

Джерело: Дейт К Дж, Введення в системи баз даних, 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>

*

*