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

Откуда:
Сообщений: 23
Здравствуйте , ребята , у меня тут возникла сложность при работе с курсором, хотел бы услышать от вас совета!
Есть такой курсор, и он почти работает xD Ругается , что не верный синтаксис около закрытия внешнего курсора
     CLOSE Writer  

Говорит , что он там ожидает увидеть совсем не это

DECLARE @adres varchar(40),
		@Name varchar(40),
		@Surname varchar(40),
		@Patronymic varchar(40),
		@Phone varchar(20),
		@ID_CL int


DECLARE Writer CURSOR SCROLL READ_ONLY FOR 
SELECT c.addres  , c.name,  c.surname , c.patronymic , c.phone ,c.client_ID
FROM client as c

OPEN Writer

FETCH NEXT FROM Writer INTO  @adres ,@Name ,@Surname,@Patronymic ,@Phone , @ID_CL
 WHILE @@FETCH_STATUS <> -1
BEGIN
	
    PRINT  + @Surname + ' ' + LEFT(@Name,1) + '. ' + LEFT(@Patronymic,1) + '. Проживает по адресу :' + @adres
    PRINT 'Контактный телефон -' + @Phone
    
    DECLARE @Model varchar(40),
		@Make varchar(40),
		@wheel varchar(40),
		@box varchar(40),
		@date date,
		@body varchar(10),
		@engine varchar(10),
		@CAR_ID int 
		PRINT '________________Информация об автомобилях клиента________________'
		DECLARE WriterCar CURSOR SCROLL READ_ONLY FOR 
			SELECT m.make , mod.model , w.wheel , b.box , a.manufactureDate ,  body ,  engineNumb , auto_id
			FROM auto as a , box as b ,  make as m , model as  mod , wheel as w
			WHERE a.box_ID = b.box_ID AND  m.make_id = a.make_id AND mod.model_id = a.model_id  AND w.wheel_ID = a.wheel_id AND a.client_ID = @ID_CL
		FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
		WHILE @@FETCH_STATUS <> -1 
		PRINT '      ' + @make + ' ' + @model + 'c ' + @wheel +'рулем'
		PRINT '      ' + 'Год выпуска : ' + YEAR(@date)
		PRINT '      ' + 'Коробка передач : ' + @box
		PRINT '      ' + 'Номер кузова - ' + @body
		PRINT '      ' + 'Двигатель - ' + @body
		
	PRINT '__________________________________________________'	
		FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
		END 
		CLOSE WriterCar
		DEALLOCATE WriterCar

    PRINT '**************************************************'
    PRINT ''
    
    

    FETCH NEXT FROM Writer INTO  @adres ,@Name ,@Surname,@Patronymic ,@Phone 
    END
    CLOSE Writer    
DEALLOCATE Writer


И ребят, не кидайтесь сразу помидорами , только учусь , заранее спасибо
13 янв 17, 02:38    [20100837]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
iljy
Member

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

у вас вот этот END
		FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
		END 
		CLOSE WriterCar


лишний, в результате последний END оказывается без BEGIN и компилятор ожидает увидеть там END CONVERSATION.

Вы с чего-то не того учиться начали, курсоры - это крайнее средство с весьма специфической областью применения, я за все время курсоры использовал... ну раза 3 наверное.
13 янв 17, 02:47    [20100839]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
ba3uk
Member

Откуда:
Сообщений: 23
iljy,Спасибо за подсказку , действительно ,запамятывал.
Студенту сказали ,что он должен уметь делать - студент учится делать, а пригодиться или нет , это уже другой разговор)
Но спасибо за информацию)
13 янв 17, 02:57    [20100844]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7480
iljy,

ничего он не лишний. наоборот одного BEGIN не хватает.

DECLARE WriterCar CURSOR SCROLL READ_ONLY FOR 
			SELECT m.make , mod.model , w.wheel , b.box , a.manufactureDate ,  body ,  engineNumb , auto_id
			FROM auto as a , box as b ,  make as m , model as  mod , wheel as w
			WHERE a.box_ID = b.box_ID AND  m.make_id = a.make_id AND mod.model_id = a.model_id  AND w.wheel_ID = a.wheel_id AND a.client_ID = @ID_CL
		FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
WHILE @@FETCH_STATUS <> -1 
BEGIN
		PRINT '      ' + @make + ' ' + @model + 'c ' + @wheel +'рулем'
13 янв 17, 02:57    [20100845]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
ba3uk
Member

Откуда:
Сообщений: 23
Relic Hunter,
Да, спасибо)
7 утра дурно влияют на людей )
13 янв 17, 03:06    [20100846]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
ba3uk
Member

Откуда:
Сообщений: 23
Ребят, еще возник вопрос. Надо заполнить курсор , но я не до конца догоняю как это правильно сделать, это совсем нелепый вариант
DECLARE
  @priceWork int , 
	    @Discription varchar(100),
	    @priceDetail int , 
	    @Detail varchar(30),
	    @payStatus int
	    
	    
	    DECLARE TotalCount CURSOR SCROLL READ_ONLY FOR 
	    SELECT (
			SELECT  w.price , w.description
			FROM service as s,  work as w , estimate as e
		    WHERE  e.service_ID = s.service_ID  AND s.work_ID = w.work_ID  AND e.auto_id = @CAR_ID)
		    ,
		    (SELECT d.price  , d.description 
		     FROM detail as d , estimate as e 
		     where e.detail_ID = d.detail_ID AND e.auto_id = @CAR_ID)
		     ,
		     (SELECT payStatus_ID FROM estimate where  e.auto_id = @CAR_ID)
		     
13 янв 17, 03:35    [20100854]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
doos
Member

Откуда: Ленинградская обл.
Сообщений: 165
ba3uk,

В фетче, который в теле цикла не хватает одного поля
13 янв 17, 05:37    [20100863]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
iap
Member

Откуда: Москва
Сообщений: 47049
Зачем курсор SCROLL, чего-то не понял?
Почему курсор называется Writer, а закрывается WriterCar?
13 янв 17, 10:20    [20101487]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
iap
Member

Откуда: Москва
Сообщений: 47049
iap
Зачем курсор SCROLL, чего-то не понял?
Почему курсор называется Writer, а закрывается WriterCar?
Прошу прощения. Не заметил, что внутри другой курсор объявляется
13 янв 17, 10:22    [20101500]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
Гость проходящий мимо
Guest
ba3uk,

У Вас во 2-ом курсоре не хватает BTGIN

FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
WHILE @@FETCH_STATUS <> -1
BEGIN
PRINT ' ' + @make + ' ' + @model + 'c ' + @wheel +'рулем'
PRINT ' ' + 'Год выпуска : ' + YEAR(@date)
PRINT ' ' + 'Коробка передач : ' + @box
PRINT ' ' + 'Номер кузова - ' + @body
PRINT ' ' + 'Двигатель - ' + @body

PRINT '__________________________________________________'
FETCH NEXT FROM WriterCar INTo @Model , @Make, @wheel , @box , @date , @body , @engine , @CAR_ID
END
CLOSE WriterCar
DEALLOCATE WriterCar
13 янв 17, 10:28    [20101529]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
zasandator
Member [скрыт] [заблокирован]

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

Writercar не нужно пере фич делать open?
13 янв 17, 20:30    [20104377]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ba3uk
iljy,Спасибо за подсказку , действительно ,запамятывал.
Студенту сказали ,что он должен уметь делать - студент учится делать, а пригодиться или нет , это уже другой разговор)
Но спасибо за информацию)

И даже такая постановка задачи не освобождает от обязанности думать головой -
Нильс Бор вас бы осудил
16 янв 17, 10:25    [20109196]     Ответить | Цитировать Сообщить модератору
 Re: Учимся делать курсоры )  [new]
ba3uk
Member

Откуда:
Сообщений: 23
Руслан Дамирович
И даже такая постановка задачи не освобождает от обязанности думать головой -
Нильс Бор вас бы осудил

Это верно, но когда требуют Курсор , значит надо курсор.
16 янв 17, 15:50    [20110792]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить