光标 "fetch next from" - 来自附近的语法错误

Cursor "fetch next from" - syntax error near from

我想创建程序,使用光标向我显示 20% 折扣的产品。编译下面的代码后,我收到错误消息 "Syntax error near "FROM" 第 14 行。我正在使用 Sybase。有人可以帮我解决这个问题吗? 这是我的代码:

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

您要做的就是

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

经过对 sysbase 中 cursor 的一些研究。我认为

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

在此处查看有关 sysbase http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20020_1251/html/databases/X61512.htm

CURSOR 的更多信息

好的。我的代码中有 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