Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

бд

.pdf
Скачиваний:
45
Добавлен:
24.12.2017
Размер:
1.9 Mб
Скачать

50. Оператор CASE: синтаксические формы записи, примеры использования.

Пример1: Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (ее нет в таблице РС), то вместо цены вывести текст «Нет в наличии».

Список всех моделей ПК с ценами можно получить с помощью запроса:

1.SELECT DISTINCT Product.model, price

2.FROM Product LEFT JOIN

3.PC ON Product.model = PC.model

4.WHERE product.type = 'pc'

Врезультирующем наборе отсутствующая цена будет заменена NULL-значением.

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:

1.SELECT DISTINCT product.model,

2.CASE

3.WHEN price IS NULL

4.THEN 'Нет в наличии'

5.ELSE CAST(price AS CHAR(20))

6.END price

7.FROM Product LEFT JOIN

8.PC ON Product.model = PC.model

9.WHERE product.type = 'pc'

Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены.

Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению.

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

1-я форма

CASE <проверяемое выражение>

WHEN <сравниваемое выражение 1>

THEN <возвращаемое значение 1>

WHEN <сравниваемое выражение N> THEN <возвращаемое значение N> [ELSE <возвращаемое значение>] END

2-я форма

CASE

WHEN <предикат 1>

THEN <возвращаемое значение 1>

WHEN <предикат N>

THEN <возвращаемое значение N> [ELSE <возвращаемое значение>] END

Все предложения WHEN должны иметь одинаковую синтаксическую форму, то есть нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них, так как остальные просто не будут проверяться.

В приведенном выше примере была применена вторая форма оператора

CASE.

Заметим, что для проверки на NULL стандарт предлагает более короткую форму — оператор COALESCE. Он имеет произвольное число параметров и возвращает значение первого из них, отличного от NULL. Для двух

параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

1.CASE

2.WHEN A IS NOT NULL

3.THEN A

4.ELSE B

5.END

Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:

1.SELECT DISTINCT Product.model,

2.COALESCE(CAST(price AS CHAR(20)),'Нет в наличии') price

3.FROM Product LEFT JOIN

4.PC ON Product.model = PC.model

5.WHERE Product.type = 'pc';

Применение первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере.

Управление курсором в среде MS SQL Server

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

DECLARE – создание или объявление курсора;

OPEN – открытие курсора, т.е. наполнение его данными;

FETCH – выборка из курсора и изменение строк данных с помощью курсора;

CLOSE – закрытие курсора;

DEALLOCATE – освобождение курсора, т.е. удаление курсора как объекта.

Объявление курсора

В стандарте SQL для создания курсора предусмотрена следующая команда:

<создание_курсора>::= DECLARE имя_курсора

[INSENSITIVE][SCROLL] CURSOR FOR SELECT_оператор

[FOR { READ_ONLY | UPDATE [OF имя_столбца[,...n]]}]

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

пользователями. Если ключевое слово INSENSITIVE отсутствует, создается динамический курсор.

При указании ключевого слова SCROLL созданный курсор можно прокручивать в любом направлении, что позволяет применять любые команды выборки. Если этот аргумент опускается, то курсор окажется последовательным, т.е. его просмотр будет возможен только в одном направлении – от начала к концу.

SELECT-оператор задает тело запроса SELECT, с помощью которого определяется результирующий набор строк курсора.

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

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

Создание курсора с аргументом FOR UPDATE позволяет выполнять в курсоре изменение данных либо в указанных столбцах, либо, при отсутствии аргумента OF имя_столбца, во всех столбцах.

В среде MS SQL Server принят следующий синтаксис команды создания курсора:

<создание_курсора>::=

DECLARE имя_курсора CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWAR] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING]

FOR SELECT_оператор

[FOR UPDATE [OF имя_столбца[,...n]]]

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

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

Если указано ключевое слово GLOBAL, создается глобальный курсор; он существует до закрытия текущего соединения.

При указании FORWARD_ONLY создается последовательный курсор; выборку данных можно осуществлять только в направлении от первой строки к последней.

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

При указании STATIC создается статический курсор.

При указании KEYSET создается ключевой курсор.

При указании DYNAMIC создается динамический курсор.

Если для курсора READ_ONLY указать аргумент FAST_FORWARD, то созданный курсор будет оптимизирован для быстрого доступа к данным. Этот аргумент не может быть использован совместно с аргументами FORWARD_ONLY и OPTIMISTIC.

В курсоре, созданном с указанием аргумента OPTIMISTIC, запрещается изменение и удаление строк, которые были изменены после открытия курсора.

При указании аргумента TYPE_WARNING сервер будет информировать пользователя о неявном изменении типа курсора, если он несовместим с запросом SELECT.

Открытие курсора

Для открытия курсора и наполнения его данными из указанного при создании курсора запроса SELECT используется следующая команда:

OPEN {{[GLOBAL]имя_курсора } |@имя_переменной_курсора}

После открытия курсора происходит выполнение связанного с ним оператора SELECT, выходные данные которого сохраняются в многоуровневой памяти.

Выборка данных из курсора

Сразу после открытия курсора можно выбрать его содержимое (результат выполнения соответствующего запроса) посредством следующей команды:

FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE {номер_строки

| @переменная_номера_строки}

|RELATIVE {номер_строки | @переменная_номера_строки}]

FROM ]{{[GLOBAL ]имя_курсора }| @имя_переменной_курсора }

[INTO @имя_переменной [,...n]]

При указании FIRST будет возвращена самая первая строка полного результирующего набора курсора, которая становится текущей строкой.

При указании LAST возвращается самая последняя строка курсора. Она же становится текущей строкой.

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

Ключевое слово PRIOR возвращает строку, находящуюся перед текущей. Она и становится текущей.

Аргумент ABSOLUTE {номер_строки | @переменная_номера_строки} возвращает строку по ее абсолютному порядковому номеру в полном результирующем наборе курсора. Номер строки можно задать с помощью константы или как имя переменной, в которой хранится номер строки. Переменная должна иметь целочисленный тип данных. Указываются как положительные, так и отрицательные значения. При указании положительного значения строка отсчитывается от начала набора, отрицательного – от конца. Выбранная строка становится текущей. Если указано нулевое значение, строка не возвращается.

Аргумент RELATIVE {кол_строки | @переменная_кол_строки} возвращает строку, находящуюся через указанное количество строк после текущей. Если указать отрицательное значение числа строк, то будет возвращена строка, находящаяся за указанное количество строк перед текущей. При указании нулевого значения возвратится текущая строка. Возвращенная строка становится текущей.

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

В конструкции INTO @имя_переменной [,...n] задается список переменных, в которых будут сохранены соответствующие значения столбцов возвращаемой строки. Порядок указания переменных должен соответствовать порядку столбцов в курсоре, а тип данных переменной – типу данных в столбце курсора. Если конструкция INTO не указана, то поведение команды FETCH будет напоминать поведение команды SELECT – данные выводятся на экран.

Изменение и удаление данных

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

UPDATE имя_таблицы SET {имя_столбца={ DEFAULT | NULL | выражение}}[,...n]

WHERE CURRENT OF {{[GLOBAL] имя_курсора} |@имя_переменной курсора}

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

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

DELETE имя_таблицы

WHERE CURRENT OF {{[GLOBAL] имя_курсора} |@имя_переменной курсора}

В результате будет удалена строка, установленная текущей в курсоре.

Закрытие курсора

CLOSE {имя_курсора | @имя_переменной_курсора}

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

только к открытым курсорам. Закрытый, но не освобожденный курсор может быть повторно открыт. Не допускается закрывать неоткрытый курсор.

Освобождение курсора

Закрытие курсора необязательно освобождает ассоциированную с ним память. В некоторых реализациях нужно явным образом освободить ее с помощью оператора DEALLOCATE. После освобождения курсора освобождается и память, при этом становится возможным повторное использование имени курсора.

DEALLOCATE { имя_курсора | @имя_переменной_курсора }

Для контроля достижения конца курсора рекомендуется применять функцию: @@FETCH_STATUS

Функция @@FETCH_STATUS возвращает:

0, если выборка завершилась успешно;

-1, если выборка завершилась неудачно вследствие попытки выборки строки, находящейся за пределами курсора;

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

DECLARE abc CURSOR SCROLL FOR

SELECT * FROM Клиент

Пример 13.1. Объявление курсора. DECLARE @MyCursor CURSOR

SET @MyCursor=CURSOR LOCAL SCROLL FOR SELECT * FROM Клиент

Пример 13.2. Использование переменной для объявления курсора. DECLARE abc CURSOR GLOBAL SCROLL FOR

SELECT * FROM Клиент OPEN abc

Пример 13.3. Объявление и открытие курсора. DECLARE @MyCursor CURSOR

SET @MyCursor=abc

Пример 13.4. Использование переменной для переприсваивания курсора.

Пример 13.5. Разработать курсор для вывода списка фирм и клиентов из Москвы.

DECLARE @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80)

PRINT ' Список клиентов'

DECLARE klient_cursor CURSOR LOCAL FOR SELECT Фирма, Фамилия

FROM Клиент

WHERE Город='Москва' ORDER BY Фирма, Фамилия

OPEN klient_cursor

FETCH NEXT FROM klient_cursor INTO @firm, @fam WHILE @@FETCH_STATUS=0

BEGIN

SELECT @message='Клиент '+@fam+ ' Фирма '+ @firm

PRINT @message

-- переход к следующему клиенту--

FETCH NEXT FROM klient_cursor

INTO @firm, @fam

END

CLOSE klient_cursor

DEALLOCATE klient_cursor

Пример 13.5. Курсор для вывода списка фирм и клиентов из Москвы.

Пример 13.8. Использование курсора как выходного параметра процедуры. Процедура возвращает набор данных – список товаров.

CREATE PROC my_proc

@cur CURSOR VARYING OUTPUT AS

SET @cur=CURSOR FORWARD_ONLY STATIC FOR SELECT Название FROM Товар

OPEN @cur

Пример 13.8. Использование курсора как выходного параметра процедуры.

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

DECLARE @my_cur CURSOR

DECLARE @n VARCHAR(20)

EXEC my_proc @cur=@my_cur OUTPUT

FETCH NEXT FROM @my_cur INTO @n

SELECT @n

WHILE (@@FETCH_STATUS=0)

BEGIN

FETCH NEXT FROM @my_cur INTO @n

SELECT @n

END

CLOSE @my_cur

DEALLOCATE @my_cur

51. Курсоры: понятие курсора, общий синтаксис, пример использования.

Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.

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

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

создание или объявление курсора;

открытие курсора , т.е. наполнение его данными, которые сохраняются в многоуровневой памяти;

выборка из курсора и изменение с его помощью строк данных;

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

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

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

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

В некоторых случаях применение курсора неизбежно. Однако по возможности этого следует избегать и работать со стандартными командами обработки данных: SELECT, UPDATE, INSERT, DELETE. Помимо того, что курсоры не позволяют проводить операции изменениянад всем объемом данных, скорость выполнения операций обработки данных посредством курсора заметно ниже, чем у стандартных средств SQL.

52. Понятие и классификация экранных форм.

Ввод и просмотр данных в режиме таблицы имеет много очевидных недостатков. Поэтому, как правило, для удобства пользователей создаются экранные формы, которые позволяют рационально расположить данные на экране, использовать разнообразные элементы оформления, обеспечивать возможности специфических проверок при вводе данных. Во многих СУБД имеются возможности использования Мастеров, автоматизирующих процесс создания экранных форм.

Можно квалифицировать:

1.По характеру связи с таблицами различают связанные и несвязанные экранные формы. Если форма отражает какие-либо данные из таблиц баз

данных, она называется связанной (или присоединенной), в противном случае - несвязанной.

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

1.По выполняемым функциям различают формы ввода, вывода, управляющие, смешанные.

2.По распределению данных по экранам (страницам) формы делятся на одностраничные и многостраничные; одной из разновидностей многостраничных форм можно считать формы с вкладками.

3.По способу реализации экранные формы могут быть всплывающими и невсплывающими. Всплывающая форма располагается поверх других открытых форм, даже если активной является другая форма. Всплывающая форма может быть немодальной или модальной. Если всплывающая форма - модальная, пользователь имеет возможность получить доступ к другим объектам и командам меню, пока форма открыта. Если всплывающая форма является немодальной, нельзя получить доступ к любым другим объектам или командам меню, пока форма открыта. Пользователь должен выполнить какое-либо действие, чтобы фокус был переключен на другую форму (или окно).

4.По форме представления информации экранные формы могут содержать символьную информацию, деловую графику, информацию, представленную в мультимедийной форме.

53.Понятие и классификация отчётов.

Отчет (report) — это объект базы данных, который используется для вывода на экран, в печать или файл структурированной информации. Reports позволяют извлечь из таблиц или запросов базы данных необходимую информацию и представить ее в виде удобном для восприятия. Report содержит заголовок, область данных, верхний и нижний колонтитулы, примечание и разбит на страницы.

Ниже приведены виды отчетов.

Одноколонный отчет (в столбец) — длинный столбец текста, содержащий надписи полей, их значения из всех записей таблицы или запроса.

Многоколонный отчет — сездается из отчета в одну колонку и позволяет вывести данные отчета в несколько колонок.

Табличный отчет — отчет, имеющий табличную форму.

Отчет с группировкой данных и подведением итогов — создается из табличного отчета объединением данных в группы с подсчетом итогов.

Перекрестный отчет — строится на основе перекрестных запросов и содержит итоговые данные.

Составной отчет — отчет, имеющий сложную структуру, включающий один или несколько отчетов.

Отчет, полученный слиянием документов с Word (составной документ).

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

Отчет по связанным таблицам — отчет, позволяющий выводить данные из нескольких таблиц, имеющих связь один-ко-многим.

Структура отчета. Отчет может состоять из следующих разделов.

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

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

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

Область данных — предназначена для отображения записей источника данных отчета.

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

Раздел примечаний — отображается только внизу последней страницы; сюда помещают поля с итоговыми значениями по всем записям, включенным в отчет. Отчет может быть создан при помощи Мастера отчетов или в режиме Конструктора. Обычно используют оба способа. Мастер отчетов позволяет ускорить процесс создания отчета, работа в нем производится в пошаговом режиме в диалоге с пользователем. Доработать созданный мастером отчет можно в режиме Конструктора.

Раздел Область данных может содержать вычисляемые поля, предназначенные для отображения в отчетах значений выражений на основе исходных данных.

54. Управление доступом в базах данных.

Идентификатор доступа –(login) уникальный признак объекта или субъекта доступа. Пароль - идентификатор субъекта, который является его секретом.

Разграничение доступа:

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

Санкционированный доступ - доступ к информации в соответствии с правилами разграничения доступа.

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

Соседние файлы в предмете Базы знаний и экспертные системы