Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание курсоров  [new]
Rovshan_1975
Member

Откуда:
Сообщений: 26
Здравствуйте форумчане....

Поставлена задача создать 2 курсора.
1-й будет выбирать из таблицы строки значения которых равен DELAYED

2-й будет изменять статус DELAYED на статус PAID в случае если BALANCE >=0


Вот пример:

К сообщению приложен файл (TEST.xls - 16Kb) cкачать
2 окт 13, 08:44    [14910146]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
aleks2
Guest
Скажи преподу, что он неуч.
2 окт 13, 08:53    [14910163]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104760
Rovshan_1975
Поставлена задача создать 2 курсора.

Ну так выполняйте. В чес проблема то ?
2 окт 13, 09:12    [14910215]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Rovshan_1975
Вот пример:
К сообщению приложен файл (TEST.xls - 16Kb)

Прямо по xls-файлу идти курсорами? Это, может, в форум по MS Office?
2 окт 13, 09:55    [14910395]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
DECLARE @kf_refno varchar(11), @balance decimal(15, 2), @date datetime, 
				@payment decimal(15, 2), @status varchar(7) 
				
DECLARE bal CURSOR LOCAL FORWARD_ONLY FOR 
	SELECT kf_refno, balance 
	FROM table_a 
	WHERE balance > 0 
FOR UPDATE OF balance

OPEN bal 
FETCH NEXT FROM bal INTO @kf_refno, @balance 

WHILE @@FETCH_STATUS <> -1 
BEGIN
	DECLARE pay CURSOR LOCAL FORWARD_ONLY FOR 
		SELECT date, payment, status 
		FROM table_b 
		WHERE kf_refno = @kf_refno and status = 'DELAYED' 
		ORDER BY date 
	FOR UPDATE OF status 
	
	OPEN pay
	FETCH NEXT FROM pay INTO @date, @payment, @status
	
	WHILE @@FETCH_STATUS <> -1 
	BEGIN 
		SET @balance = @balance - @payment 
		
		IF @balance >= 0 
			UPDATE table_b 
				SET status = 'PAID' 
			WHERE CURRENT OF pay 
		ELSE 
		BEGIN 
			SET @balance = 0 
			BREAK
		END
		
		FETCH NEXT FROM pay INTO @date, @payment, @status
	END 
	
	CLOSE pay 
	DEALLOCATE pay
	
	UPDATE table_a 
		SET balance = @balance 
	WHERE CURRENT OF bal 
	
	FETCH NEXT FROM bal INTO @kf_refno, @balance 
END 

CLOSE bal 
DEALLOCATE bal
2 окт 13, 09:58    [14910409]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Уленшпигель,

вы понимаете что оказываете медвежью услугу? когда чел получит диплом "о успешном окончании" и устроится к вам на работу, а вместо работы будет писать сюда же "помоги срочно дали задание, до обеда надо сделать, первый раз вижу SQL"
2 окт 13, 10:52    [14910794]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
StarikNavy, если челу выдадут диплом на основе копипасты из интернета, то претензии надо предъявлять ВУЗу. Потому что тогда ему выдадут диплом и без копипасты. За больше денег.
2 окт 13, 11:35    [14911120]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
aleks2
Guest
Уленшпигель
StarikNavy, если челу выдадут диплом на основе копипасты из интернета, то претензии надо предъявлять ВУЗу. Потому что тогда ему выдадут диплом и без копипасты. За больше денег.

Знаешь по себе? И учишь, как тебя учили?
DECLARE @kf_refno varchar(11), @balance decimal(15, 2), @date datetime, 
				@payment decimal(15, 2), @status varchar(7) 
				
DECLARE bal CURSOR LOCAL FORWARD_ONLY FOR 
	SELECT kf_refno, balance 
	FROM table_a 
	WHERE balance > 0 
FOR UPDATE OF balance

	DECLARE pay CURSOR LOCAL FORWARD_ONLY FOR 
		SELECT date, payment, status 
		FROM table_b 
		WHERE kf_refno = @kf_refno and status = 'DELAYED' 
		ORDER BY date 
	FOR UPDATE OF status 


OPEN bal 
FETCH NEXT FROM bal INTO @kf_refno, @balance 

WHILE @@FETCH_STATUS <> -1 
BEGIN
	
	OPEN pay
	FETCH NEXT FROM pay INTO @date, @payment, @status
	
	WHILE @@FETCH_STATUS <> -1 
	BEGIN 
		SET @balance = @balance - @payment 
		
		IF @balance >= 0 
			UPDATE table_b 
				SET status = 'PAID' 
			WHERE CURRENT OF pay 
		ELSE 
		BEGIN 
			SET @balance = 0 
			BREAK
		END
		
		FETCH NEXT FROM pay INTO @date, @payment, @status
	END 
	
	CLOSE pay 
	
	UPDATE table_a 
		SET balance = @balance 
	WHERE CURRENT OF bal 
	
	FETCH NEXT FROM bal INTO @kf_refno, @balance 
END 

CLOSE bal 
	DEALLOCATE pay
DEALLOCATE bal
2 окт 13, 13:45    [14912136]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
aleks2
Знаешь по себе? И учишь, как тебя учили?
...


и чего, такое даже работать будет?
2 окт 13, 14:13    [14912330]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
daw
и чего, такое даже работать будет?


ааа. в бол пишут, это в 6.5-ом так работало...
но более позже:
BOL
Variables may be used as part of the select_statement that declares a cursor. Cursor variable values do not change after a cursor is declared.
2 окт 13, 14:20    [14912379]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
aleks2, не понял смысла наезда.
2 окт 13, 16:30    [14913503]     Ответить | Цитировать Сообщить модератору
 Re: Создание курсоров  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
daw
и чего, такое даже работать будет?


аж бегом. если одну опечатку исправить и если в обеих таблицах есть первичные ключи.
2 окт 13, 16:41    [14913606]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить