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

Откуда:
Сообщений: 23
Здравствуйте, уважаемые форумчане. У меня возникла проблема при написании курсора к своей БД. Пишу курсор для вывода списка приобретенных клиентами товаров и их общей стоимости. В один курсор заносятся все клиенты, затем для каждой строки курсора, т.е. для каждого клиента, определяется и распечатывается другой курсор – его покупки. Подсчитывается общая стоимость покупок клиента. Но дело в том, что в моей БД есть одни и те же клиенты с разными типами оплаты (перевод/наличные) и с разными номерами счетов. Нужно сделать так, чтобы курсор различал их и выводил для каждого случая свой счет.
DECLARE 
        @customer_id	INT,
	@surname    VARCHAR(30),
        @c_name     VARCHAR(30),       
        @firstname  VARCHAR(30),
        @account    CHAR(12),
	@p_name		CHAR(20),
	@message	VARCHAR(100),
        @tov_name	VARCHAR(30),
	@date			DATETIME,
        @price			INT,
	@count			INT,
        @s				INT

	PRINT '  Список покупок
	'  
DECLARE klient_cursor CURSOR LOCAL FOR
   SELECT Customer.customer_id, surname, [dbo].[Customer].name, firstname, account, [dbo].[Paysystem].name
    FROM [dbo].[Customer] inner join [dbo].[Zakaz] ON
	[dbo].[Customer].customer_id=[dbo].[Zakaz].customer_id
	inner join [dbo].[Oplata] ON
	[dbo].[Oplata].zakaz_id=[dbo].[Zakaz].zakaz_id
	LEFT OUTER JOIN [dbo].[Account] ON
	[dbo].[Account].account_id=[dbo].[Oplata].account_id
	LEFT OUTER JOIN [dbo].[Paysystem] ON
	[dbo].[Paysystem].paysystem_id=[dbo].[Account].paysystem_id
	GROUP BY Customer.customer_id, surname, [dbo].[Customer].name, firstname, account, [dbo].[Paysystem].name

OPEN klient_cursor

FETCH NEXT FROM klient_cursor
INTO @customer_id, @surname, @c_name, @firstname, @account, @p_name
WHILE @@FETCH_STATUS=0
BEGIN
    IF (@account IS NULL AND @p_name IS NULL)
	SELECT @message='Клиент '+@surname+' '+@c_name+' '+@firstname+', оплата наличными'
    ELSE 
	SELECT @message='Клиент '+@surname+' '+@c_name+' '+@firstname+', номер счета: '+@account+', платежная система: '+@p_name 
	PRINT @message
	    PRINT'________________________________________________________________________'
    SELECT @message='Наименование товара                Дата покупки   Стоимость   количество'
    PRINT @message
    DECLARE tovar_cursor CURSOR FOR
        
SELECT 
		Tovar.name, Zakaz.[date], PriceList.price, Jurnal_zakazov.[count]	
		FROM Customer INNER JOIN Zakaz ON 
		Customer.customer_id=Zakaz.customer_id
		INNER JOIN Jurnal_zakazov ON
		Jurnal_zakazov.zakaz_id=Zakaz.zakaz_id
		INNER JOIN Tovar ON
		Tovar.tovar_id=Jurnal_zakazov.tovar_id
		INNER JOIN Pricelist ON
		Pricelist.tovar_id=Tovar.tovar_id
        WHERE Zakaz.customer_id=@customer_id [color=red]--я так понимаю, надо изменить эту часть, но не знаю как[/color]

    OPEN tovar_cursor
    FETCH NEXT FROM tovar_cursor 
      INTO @tov_name, @date, @price, @count
    IF @@FETCH_STATUS<>0
        PRINT ' Нет покупок'
    WHILE @@FETCH_STATUS=0
    BEGIN
        SELECT @message='   '+@tov_name+'   '+ CAST(@date AS CHAR(12))+'  '+CAST(@price AS CHAR(6))+'      '+CAST(@count AS CHAR(6))
        PRINT @message
        SET @s=@s+@count*@price
        FETCH NEXT FROM tovar_cursor
        INTO @tov_name, @date, @price, @count 
    END
    CLOSE tovar_cursor
    DEALLOCATE tovar_cursor
 	
		SELECT @message='Общая стоимость: '+ CAST(@s AS CHAR(6))
		PRINT'________________________________________________________________________'
		PRINT @message 
		SET @s=0
		PRINT'
		' 
-- переход к следующему клиенту--
    FETCH NEXT FROM klient_cursor
	INTO @customer_id, @surname, @c_name, @firstname, @account, @p_name
 
END
CLOSE klient_cursor
DEALLOCATE klient_cursor


К сообщению приложен файл. Размер - 40Kb


Сообщение было отредактировано: 11 янв 14, 12:24
11 янв 14, 00:18    [15400325]     Ответить | Цитировать Сообщить модератору
 Re: курсоры  [new]
sdet
Member

Откуда:
Сообщений: 463
isec,

Нужно делать без курсора
11 янв 14, 00:44    [15400444]     Ответить | Цитировать Сообщить модератору
 Re: курсоры  [new]
isec
Member

Откуда:
Сообщений: 23
sdet,
это курсовая работа, в ней нужно использовать курсоры, что я и пытаюсь сделать(
11 янв 14, 00:48    [15400456]     Ответить | Цитировать Сообщить модератору
 Re: курсоры  [new]
SERG1257
Member

Откуда:
Сообщений: 2748
isec
это курсовая работа, в ней нужно использовать курсоры
Таки нужно или можно? Ибо курсоры это медленно (в каждой итерации вы определяете, открываете, закрываете и удаляете товарный курсор), это глюкаво - ибо оптимизатор ошибку не заметит, будет как программист написал, а не так как он хотел.
Более эффективно будет написание одного большого запроса.

По сабжу - в вашей таблице заказ есть связь с account_id в оплате - добавьте ее.

И вдобавок - оформлено все с большой нелюбовью к читателям, отсекая более придирчивых критиков чем я.

Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 11 янв 14, 12:25
11 янв 14, 01:53    [15400647]     Ответить | Цитировать Сообщить модератору
 Re: курсоры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
isec
это курсовая работа, в ней нужно использовать курсоры
Это в вашем институте изучают строение НЛО ?
Может стоит сменить?

Если это урок чтобы вы в дальнейшем никогда не пользовались курсорами, то вы не прочитали важный пункт в задаче:
* Спрашивать решение у кого либо строго запрещено.
Наслаждайтесь.
12 янв 14, 06:44    [15403944]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить