2017-01-29 8 views
0

Я хочу создать процедуру, которая показывает мне продукты с 20% скидкой с помощью курсора. .? После компиляции кода ниже я получаю сообщение об ошибке «Ошибка синтаксиса около„FROM“линии 14. Я использую Sybase Может кто-нибудь помочь мне с этим Вот мой код:Курсор «fetch next from» - ошибка синтаксиса рядом с

CREATE PROCEDURE "ProduktyPoZnizce20procent2"(/* @parameter_name parameter_type [= default_value] [OUTPUT], ... */) 
AS 
BEGIN 
    declare @IDPR INTEGER 
    declare @typ VARCHAR(30) 
    declare @model varchar(30) 
    declare @cena float 

DECLARE ProductCursor CURSOR FOR 
SELECT IDProduct from Product 

Open ProductCursor 

FETCH NEXT FROM ProductCursor 
INTO @IDPR 

while(@@FETCH_STATUS = 0) 
    BEGIN 
     select @typ = Product.product_type, @model=Product.name, @cena = Product.price * 0.8 
     from Product 
     where @IDPR = Product.IDProduct 

     print(cast(@typ as nvarchar(30)) + ' ' + cast(@model as nvarchar(30)) + ' = ' + cast(@cena as varchar(10))) 

     FETCH NEXT FROM ProductCursor INTO @IDPR 

    END 

close ProductCursor 
DEALLOCATE CURSOR ProductCursor 

END 
+2

Почему бы использовать курсор для этого? И вы также написали бесконечный цикл, но это, казалось бы, другое дело. –

+0

«Я использую Sybase», в то время как на ваш вопрос помечен SQL Server. –

+0

Потому что я должен использовать курсор для чего-то (это мой спрос на проект), и я не нашел что-то лучше. Почему существует бесконечный цикл? – Pawel

ответ

0

Все вы пытаясь сделать

SELECT Cast(Product.product_type AS NVARCHAR(30)) 
     + " " + Cast(Product.NAME AS NVARCHAR(30)) 
     + " = " 
     + Cast(Product.price * 0.8 AS VARCHAR(10)) 
FROM Product 

После некоторых исследований о cursor в sysbase. Я думаю, что

FETCH NEXT FROM ProductCursor INTO @IDPR 

должно быть

fetch ProductCursor into @IDPR 

DEALLOCATE ProductCursor 

должно быть

deallocate cursor ProductCursor 

Для проверки записи в цикле @@FETCH_STATUS должно быть @@sqlstatus

/* now loop, processing all the rows 
** @@sqlstatus = 0 means successful fetch 
** @@sqlstatus = 1 means error on previous fetch 
** @@sqlstatus = 2 means end of result set reached 
*/ 

while (@@sqlstatus = 0) 
Begin 
.. 
End 

Проверить здесь для получения дополнительной информации о CURSOR в sysbase http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20020_1251/html/databases/X61512.htm

+0

Правильно! Но мне нужно использовать курсор, и я придумал это. Может быть, это не очень хороший пример, и я мог бы придумать лучшую идею. Я изучаю curors Я просто хочу знать, что не так с моим кодом. – Pawel

+0

@Pawel - проверьте обновление .. –

+0

Он скомпилирован успешно, но через 2 минуты он не показал мои 20 продуктов после скидки. – Pawel

0

OK. В моем коде было 2 ошибки: я не продвигался с моим курсором. Правильный синтаксис для отправки моего курсора на следующую строку:

FETCH NEXT ProductCursor 
INTO @IDPR 

и его следует вызывать в цикле и в цикле.

Следующим шагом было правильно напечатать результат на экране. Поскольку

print(cast(@typ as nvarchar(30)) + ' ' + cast(@model as nvarchar(30)) + ' = ' + cast(@cena as varchar(10))) 

ничего на экране не дать ему должно быть заменено

message (cast(@typ as nvarchar(30)) + ' ' + cast(@model as nvarchar(30)) + ' = ' + cast(@cena as varchar(10))) type status to client 

весь код теперь выглядит следующим образом:

CREATE PROCEDURE "ProduktyPoZnizce20procent2"(/* @parameter_name parameter_type [= default_value] [OUTPUT], ... */) 
AS 
BEGIN 
    declare @IDPR INTEGER 
    declare @typ VARCHAR(30) 
    declare @model varchar(30) 
    declare @cena float 

DECLARE ProductCursor CURSOR FOR 
SELECT IDProduct from Product 

Open ProductCursor 

FETCH NEXT ProductCursor 
INTO @IDPR 

while(@@FETCH_STATUS = 0) 
    BEGIN 
     select @typ = Product.product_type, @model=Product.name, @cena = Product.price * 0.8 
     from Product 
     where @IDPR = Product.IDProduct 

     message(cast(@typ as nvarchar(30)) + ' ' + cast(@model as nvarchar(30)) + ' = ' + cast(@cena as varchar(10))) type status to client 


    FETCH NEXT ProductCursor 
    INTO @IDPR 

    END 

close ProductCursor 
DEALLOCATE CURSOR ProductCursor 

END 

 Смежные вопросы

  • Нет связанных вопросов^_^