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

Откуда:
Сообщений: 6
Добрый вечер!
помогите кто чем может :)
Задача:
написать скалярную функцию с рекурсией и курсорам, где:
IN: ID категории
OUT : количество продуктов в категории (включая вложенные категории и их продукты)

-- входные данные название категории
ALTER  Function  GetCategoryProduct ( @Category_ID INT)
RETURNS int 
AS 
BEGIN 


declare @count int
declare @tmp table
(
category int,
total_product int
)
--кол-во продуктов для главной категории продуктов 
set @count = (select count(1) from LinkTable Where idcategory = @category_ID)


insert into @tmp (category)
select P_id from category 
where P_id=@category_id


-- добавление id дочерней во временную таблицу
Insert Into @tmp (id)
-- проверка  существование дочерней
IF EXISTS (select id from category where P_id=@category_id)



return @count
END
exec dbo.GetCategoryProduct



--- если  нету продуктов тогда
--ELSE (select @id=id from category where P_id NOT LIKE @category_id)
--если во временной таблице есть продукты добавляем курсор 
--IF (select id from @tmp where id>0)
Declare Cur.Product Cursor 
For 
Select ID from @tmp

--Открытие Курсора
Open Cur.Product 
-- Выполнение курсоpа внутри процедуры 
LOOP
FETCH Cur.Product INTO GetCategoryProduct;
EXIT WHEN Cur.Product%NOTFOUND;
--EXIT WHEN GetCategoryProduct.@Category_ID%NOTFOUND;
END LOOP; CLOSE Cur.Product; END;
 
 
 --добавление результата(количество товаров в категории после прохождения цикла)
 Insert Into  @result
 SET TotalProduct = @count + function(@Category_ID)
 from @tmp

return @Category_ID
END
30 май 12, 20:33    [12640106]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
aleks2
Guest
Это бред?

ЗЫ.
Интересно, как вы различите
return @count
и
return @Category_ID
?
30 май 12, 20:55    [12640203]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Ziliboba609
Member

Откуда:
Сообщений: 6
return @count
END
exec dbo.GetCategoryProduct

не закоментил ,
а по сути там много бреда но вот опыта не хватает что бы всё сделать правильно
30 май 12, 21:01    [12640234]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А что такое LOOP, EXIT WHEN, END LOOP, exec dbo.GetCategoryProduct?
Сервер-то какой вообще?
30 май 12, 21:03    [12640246]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Ziliboba609
Member

Откуда:
Сообщений: 6
iap
А что такое LOOP, EXIT WHEN, END LOOP, exec dbo.GetCategoryProduct?
Сервер-то какой вообще?


Пытался сделать рекурсию.....
что бы данные с курсора входи в функцию и там обрабатывались тем самым узнали бы "глубину" категорий и посчитали бы количество продуктов в категориях.



Microsoft SQL Server 2008 r2
30 май 12, 21:07    [12640273]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ziliboba609
iap
А что такое LOOP, EXIT WHEN, END LOOP, exec dbo.GetCategoryProduct?
Сервер-то какой вообще?


Пытался сделать рекурсию.....
что бы данные с курсора входи в функцию и там обрабатывались тем самым узнали бы "глубину" категорий и посчитали бы количество продуктов в категориях.



Microsoft SQL Server 2008 r2
Если нельзя, но очень хочется, то можно, да?
В смысле писать что хочешь, выдумывать свои ключевые слова для сервера и т.д.?
Странная позиция. Кто ж Вам тут всё с нуля распишет? Ведь Ваши знания равны нулю!
Самое время сходить в BOL

Интересно, и где же это дают задания про курсор?
30 май 12, 21:15    [12640322]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Ziliboba609
Member

Откуда:
Сообщений: 6
iap
Ziliboba609
пропущено...


Пытался сделать рекурсию.....
что бы данные с курсора входи в функцию и там обрабатывались тем самым узнали бы "глубину" категорий и посчитали бы количество продуктов в категориях.



Microsoft SQL Server 2008 r2
Если нельзя, но очень хочется, то можно, да?
В смысле писать что хочешь, выдумывать свои ключевые слова для сервера и т.д.?
Странная позиция. Кто ж Вам тут всё с нуля распишет? Ведь Ваши знания равны нулю!
Самое время сходить в BOL

Интересно, и где же это дают задания про курсор?



маемо шо маемо
Я же не писал что вот блин это так должно быть я не программист и с СУБД знаком 7 день ,поэтому и такой запрос.Создал тему не для оценки своих знаний а для получение помощи даже в название указано " НЕОБХОДИМА ПОМОЩЬ"
30 май 12, 22:35    [12640552]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ziliboba609
маемо шо маемо
Я же не писал что вот блин это так должно быть я не программист и с СУБД знаком 7 день ,поэтому и такой запрос.Создал тему не для оценки своих знаний а для получение помощи даже в название указано " НЕОБХОДИМА ПОМОЩЬ"


а почему в задании пункт насчёт курсоров и вот эти loop и exit when в попытке решения? на оракл похоже
30 май 12, 23:07    [12640611]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Ziliboba609
Member

Откуда:
Сообщений: 6
Shakill
Ziliboba609
маемо шо маемо
Я же не писал что вот блин это так должно быть я не программист и с СУБД знаком 7 день ,поэтому и такой запрос.Создал тему не для оценки своих знаний а для получение помощи даже в название указано " НЕОБХОДИМА ПОМОЩЬ"


а почему в задании пункт насчёт курсоров и вот эти loop и exit when в попытке решения? на оракл похоже





Насчёт задания я вам не скажу почему нужно через курсор,по поводу наличия в запросе какой то невнятной джигурдени,написано выше :) я предположил что так.
30 май 12, 23:13    [12640622]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
Ziliboba609
Member

Откуда:
Сообщений: 6
Собственно вот эта функция, может кому и поможет.
CReate Function  GetCategoryProduct2 ( @Category_ID INT)
RETURNS int 
AS 
BEGIN 

declare @resultID int
declare @count int
declare @tmp table
(
category int,
total_product int
)


set @count = (select count(1) from LinkTable Where idcategory = @Category_ID)

insert into @tmp (dbo.category)
select P_id from dbo.category 
where P_id=@category_id


IF EXISTS (select id from category where P_id=@category_id)



Declare Cur Cursor For 
select * from @tmp where category=@category_id


Open Cur;
declare @TotalCount int


FETCH NEXT FROM Cur INTO @resultID
WHILE (@@FETCH_STATUS = 0 )
BEGIN;  

Set @TotalCount = @count +  [dbo].GetCategoryProduct2(@resultID)
   

   FETCH NEXT FROM Cur INTO  @TotalCount
END
 close Cur
 deallocate Cur

return @TotalCount
END



--Exec GetCategoryProduct2 '8'
31 май 12, 18:43    [12646404]     Ответить | Цитировать Сообщить модератору
 Re: Необходима помощь написание процедуры.  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
Что-то как-то сложно
declare @tmp table
(
category int,
total_product int
)
insert into @tmp (dbo.category)
select P_id from dbo.category 
where P_id=@category_id

Это как и зачем?
IF EXISTS (select id from category where P_id=@category_id)

Это к чему?
Если уж очень хочется, то пишут так:
IF EXISTS (select id from category where P_id=@category_id)
  BEGIN
  .....
  END

Курсор вообще мрачно написан.
31 май 12, 21:58    [12647130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить