ЗНАЕТЕ ЛИ ВЫ?

Warning: Null value eliminated by aggregate or other set operation.



Курсор содержит 6 строк.

3. Задание: выведите на экран содержимое курсора из задания 2. Перед тем, как
выполнять это задание,- посмотрите типы данных в таблице titles, хотя бы с помощью
команды select * from titles. Оператор print требует, чтобы всё печатаемые данные были
типа varchar или char, поэтому необходимы функции преобразования, например:

CAST (@fmoney As varchar(12))

CAST (@intSum As varchar(l0))

4. Проведём эксперимент. Создадим ключевой, динамический, последовательный и
статический курсоры и посмотрим, как они будут вести себя при удалении исходной
строки. Для этого сначала скопируем содержимое таблицы publishers (из БД PUBS) в
таблицу
publ, с которой и будем проводить эксперимент, чтобы не повредить БД.

Итак, создадим таблицу publ:

SELECT * INTO publ FROM publishers

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

Для определения ключевого курсора, основанного на таблице publ, необходимо провести дополнительные действия. Хотя таблица publ и содержит столбец pub_id, значения в котором уникальны, сервер не будет использовать его автоматически. Поэтому создадим в таблице publ уникальный индекс IX_unique_publ, построенный на столбце pub_id: CREATE UNIQUE INDEX IX_unique_publ ON publ (pub_id)

Посмотрите, какие данные содержит таблица publ: select * from publ

Итак, у нас будет 4 курсора разных типов. Мы выберем с помощью каждого из курсоров

первую строку, выполнив команду FETCH FIRST (кроме последовательного, который

допускает только команду FETCH NEXT). Затем удалим строку таблицы publ, имеющую

в столбе pub_id значение 0877. После этого попытаемся считать из каждого курсора следующую строку с помощью команды FETCH NEXT:

BEGIN TRAN

DECLARE stat_curs CURSOR STATIC FOR SELECT * FROM publ

DECLARE keys_curs CURSOR KEYSET FOR SELECT * FROM publ

DECLARE dyna_curs CURSOR DYNAMIC FOR SELECT * FROM publ

DECLARE ffor_curs CURSOR FAST_FORWARD FOR SELECT * FROM publ

OPEN stat_curs

OPEN keys_curs

OPEN dyna_curs

OPEN ffor_curs

FETCH FIRST FROM stat_curs

FETCH FIRST FROM keys_curs

FETCH FIRST FROM dyna_curs

FETCH NEXT FROM ffor_curs

PRINT 'Удаление строки из таблицы publ'

DELETE FROM publ WHERE pub_id='0877'

FETCH NEXT FROM stat_curs

FETCH NEXT FROM keys_curs

FETCH NEXT FROM dyna_curs

FETCH NEXT FROM ffor_curs

SELECT * FROM publ

ROLLBACK TRAN

SELECT * FROM publ

Если курсор уже создан, необходимо закрыть и освободить курсор, например:

Close stat_curs

Deallocate stat_curs

 

5. Изменение исходных данных.

Курсоры позволяют не только выбирать данные, но и изменять строки исходных таблиц. Идея использования курсора для изменения исходных данных состоит в том, что изменяется строка таблицы, соответствующая текущей строке курсора.

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

UPDATE table_name SET {column_name = {DEFAULT | NULL | expression}} [,...n] WHERE CURRENT OF cursor_name

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

BEGIN TRAN

SELECT * FROM publ

DECLARE keys_curs CURSOR KEYSET FOR

SELECT * FROM publ FOR UPDATE OF city

OPEN keys_curs

FETCH FIRST FROM keys_curs

FETCH NEXT FROM keys_curs

UPDATE publ SET city = city + '#' WHERE CURRENT OF keys_curs

--изменили только вторую строку

SELECT * FROM publ

FETCH RELATIVE 0 FROM keys_curs

ROLLBACK TRAN

Работа приведенного примера сводится к изменению второй строки таблицы publ. Точнее, будет изменено значение в столбце city, к которому в конец добавляется символ #.

6. Задание: выведите на экран содержимое курсора из задания 5, чтобы ко всем строкам таблицы был добавлен символ #.





Последнее изменение этой страницы: 2017-01-25; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.238.107.166 (0.005 с.)