Программирование >>  Хронологические базы данных 

1 ... 339 340 341 [ 342 ] 343 344 345 ... 348


WITH LONG TERM EMPS AS ( SELECT * FROM EMP

WHERE DATE HIRED < DATE 1980-01-0Г )

SELECT EMPt, ( LONG TERM CT - 1 ) AS t OF FELLOW LONG TERM EMPS FROM LONG TERM EMPS AS LI,

( SELECT DEPTt, COUNT(*) AS LONG TERM CT

FROM LONG TERM EMPS

GROUP BY DEPTt ) AS L2 WHERE LI.DEPTt = L2.DEPTt ;

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

В языке SQL3 предложение WITH может быть использовано, в частности, для формулирования определенных рекурсивных запросов. Например, для данной таблицы PARENT OF{PARENT,CHILD) следующий рекурсивный запрос возвращает все пары людей (а, Ь), таких, что а- предок Ь. Обратите внимание, что определение, которое вводит имя ANCESTOR OF, включает ссылку на само имя ANCESTOR OF.

WITH RECURSIVE ANCESTOR OF ( ANCESTOR, DESCENDANT ) AS ( SELECT PARENT, CHILD

FROM RARENT 0F

UNION

SELECT A.PARENT, P.CHILD

FROM ANCESTOR OF AS A, PARENT OF AS P

WHERE A.CHILD = P.PARENT )

SELECT *

FROM ANCESTOR OF

Условные выражения

В языке SQL3 предоставляется новое условие DISTINCT (не путайте с существующим условием UNIQUE; см. приложение А). Оно предназначено для проверки, являются ли две строки различными . Пусть заданы две строки Left и Right. В них должно содержаться одно и то же количество, например п, компонентов. Пусть i-e компоненты строк Left и Right- Li и Ri (i= 1, 2, п) соответственно. Тип компонента Li должен быть совместимым с типом компонента Ri. Тогда после вычисления выражения

Left IS DISTINCT FROM Right

будет получен результат ложь, если и только если для всех i либо выражение Li = Ri имеет значение истина, либо Li и Ri оба равны NULL-значениям. В противном случае возвращается истина. (Иначе говоря, строки Left и Right являются различными , если и только если они не дублируют одна другую в смысле главы 18.) Отметим, что условие DISTINCT никогда не дает в результате значение неизвестно.



в языке SQL3 также предоставляется новое условие SIMILAR, которое (как и условие LIKE) служит для шаблонного сравнения символьных строк, т.е. с его помошью проверяется, удовлетворяет ли данная символьная строка некоторому заданному шаблону. Отличие заключается в том, что условие SIMILAR поддерживает более широкий диапазон возможностей ( символы-заменители и т.п.) по сравнению с условием LIKE. Синтаксис этого условия следующий.

<выражение типа символьной строкй> [NOT] SIMILAR ТО <ша6лон>

[ ESCAPE <исключениё> ]

Здесь параметры <ша6лон> и <исключение> по сути те же, что и в условии LIKE, но параметр <ша6лон> может включать дополнительные специальные символы - не просто и % , как в условии LIKE, а также * , + , - и многие другие. Общее их назначение заключается в поддержке правил анализа выражений, записанных на некотором формальном языке.

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

В завершение этого подраздела отметим, что при наличии нового встроенного типа BOOLEAN условные выражения становятся просто скалярными выражениями специального вида (чем, впрочем, они и должны были быть всегда).

Целостность

в языке SQL3 поддерживается ограничение RESTRICT <ссылочное действие>, которое подобно, но не идентично опции N0 ACTION (для уяснения различия обратитесь к главе 8). Также включена некоторая поддержка триггерных процедур (триггеров), в частности имеется оператор CREATE TRIGGER, которым определяется триггер- комбинация определений события и действия.

Событие - это операция INSERT, UPDATE (необязательно для указанных столбцов) или DELETE для указанной именованной таблицы.

Действие - это действие (фактически - процедура), которое будет выполнено AFTER (после) или BEFORE (до) обработки указанного события.

Точнее, действие состоит из необязательного условного выражения (по умолчанию равного истине) и SQL-процедуры, которая будет выполнена, если и только если условие истинно, когда событие произойдет. Пользователь может указать, будет ли действие выполняться один раз, когда случается событие, или же один раз для каждой строки FOR EACH ROW таблицы, с которой данное событие связано. Более того, спецификации действия могут ссылаться на значения до и после в таблице, связанной с конкретным событием, предоставляя таким образом примитивный уровень поддержки для, помимо всего прочего, ограничений перехода.

Обновление представлений

в языке SQL3 расширена поддержка обновления представлений за счет включения представлений типа UNION ALL и представлений, определенных на базе соединений типа один ко многим и многие ко многим . Аналогичные расширения имеются и для курсоров.



Управление транзакциями

в язык SQL3 включено несколько новых возможностей управления транзакциями.

Использование явного оператора START TRANSACTION (с теми же операндами, что и у оператора SET TRANSACTION; см. главу 14)

Использование опции WITH HOLD для оператора объявления курсора DECLARE CURSOR (опять же, см. главу 14)

Поддержка контрольных точек (см. аннотацию к [14.11])

Безопасность

в языке SQL3 поддерживаются привилегии выборки конкретных столбцов

(привилегии SELECT (х) позволяют их обладателю ссылаться на конкретный столбец х конкретной именованной таблицы в параметре <та6личное выражение>). Также поддерживаются определяемые пользователем роли. В качестве примера можно привести роль ACCG, означающую любого сотрудника бухгалтерии. Однажды созданная роль может наделяться привилегиями точно так, как если бы это был идентификатор пользователя. Более того, роли могут предоставляться, подобно привилегиям, и так же, как все привилегии, могут предоставляться или пользователю, или другой роли.

Отсутствующая информация

Здесь мы ограничимся лишь одним наблюдением. Использование возможностей новых типов в языке SQL3 (как и ожидалось) усложняется наличием NULL-значений. Например, пусть V- переменная некоторого структурированного типа Т. Тогда может быть так, что значение некоторого компонента переменной V равно NULL-значению (в этом случае условное выражение V = V вычисляется, как значение неизвестно), тем не менее условное выражение V IS NULL вычисляется, как ложь1 Фактически в общем случае можно сказать, что если ({V = V) IS NOT TRUE) IS TRUE- истина, то или значение V равно NULL-значению, или переменная V включает компонент, значение которого равно NULL-значению.

Поддержка принятия решений

в язык SQL3 включена поддержка опций GROUPING SETS, ROLLUP и CUBE для предложения GROUP BY, как было описано в главе 21.



1 ... 339 340 341 [ 342 ] 343 344 345 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика