Шаг 27 - Курсоры и хранимые процедуры

Курсор - это хорошая вещь. Вообще-то создание самого SQL было способом борьбы с курсорами. Но раз жизнь показывает в виде реализации в SQL Server, что без этого нельзя, то можно пользоваться. Итак, давайте посмотрим как можно объявить курсор.

DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type

Объявляем курсор с именем CURSOR_TYPE для результата запроса SELECT * FROM type. Теперь можно курсор открыть.

OPEN CURSOR_TYPE

После использования закрыть:

CLOSE CURSOR_TYPE

Но закрытие не приведет к освобождению ресурсов. Курсор нужно удалить.

DEALLOCATE CURSOR_TYPE

Для получения записи нужно использовать FETCH. Для поверки, что записи есть @@FETCH_STATUS. Смотрим как можно пробежаться по всем записям.

DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type
OPEN CURSOR_TYPE
FETCH NEXT FROM CURSOR_TYPE
WHILE @@FETCH_STATUS = 0
BEGIN

	FETCH NEXT FROM Employee_Cursor

END
CLOSE CURSOR_TYPE
DEALLOCATE CURSOR_TYPE

Давайте наши знания применим к шагу "Шаг 26 - Автоматическое получение сумм в другую таблицу" для того, чтобы пробежаться по таблице TYPE и посчитать соответствующие суммы.

CREATE TRIGGER NEW ON dbo.allcar 
FOR INSERT,UPDATE,DELETE 
AS

DECLARE @cars numeric(18,2)
DECLARE @types INT
DECLARE @chars char(30)
DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type

OPEN CURSOR_TYPE

FETCH NEXT FROM CURSOR_TYPE
INTO @types,@chars

SELECT @cars = (SELECT SUM(prise) FROM allcar WHERE type=@types)
UPDATE prisecar SET CountProse=@cars WHERE TYPE=@types

WHILE @@FETCH_STATUS = 0
BEGIN

	FETCH NEXT FROM CURSOR_TYPE
	INTO @types,@chars

	SELECT @cars = (SELECT SUM(prise) FROM allcar WHERE type=@types)
	UPDATE prisecar SET CountProse=@cars WHERE TYPE=@types

END

CLOSE CURSOR_TYPE
DEALLOCATE CURSOR_TYPE
GO

Результат немного громоздкий по сравнению с прошлым шагом. Но зато мы спокойно можем добавить новые типы в таблицу type и новую запись в таблицу prisecar и будет автоматически иметь общие суммы стоимости не меняя логику. А она такая. Пробежаться по type и на основе ID_TYPE посчитать сумму техники в таблице allcar и эту сумму занести в поле в таблице prisecar. Если поступить, как в прошлом шаге, то мы должны были писать новый код для подсчета сумм.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.09.2001