是否可以在MySQL UDF中的IF条件中声明Cursor

时间:2013-06-07 05:29:47

标签: php mysql sql-server database

我可以在if语句中声明游标吗?

如果可能的话我怎么能做到?

因为我只是像这样制作光标

CREATE FUNCTION `fn_test`(
    ProductID BIGINT(20)
)
RETURNS DECIMAL(10,2)

BEGIN
DECLARE PrductDiscValue DECIMAL(10, 2);
DECLARE DiscType INT(1);
DECLARE DiscValue DESIMAL(10,2);

IF ProductID != 0 THEN 
    SET PrductDiscValue = (SELECT Discountvalue, DiscountType FROM discount WHERE FIND_IN_SET(ProductID,DiscIDs);
END IF;

RETURN ProductDiscountValue(1);

但这不起作用。所以,我做了以下

IF ProductID != 0 THEN 
    DECLARE PrductDiscValue CURSOR FOR SELECT Discountvalue, DiscountType FROM discount WHERE FIND_IN_SET(ProductID,DiscIDs;
END IF;

OPEN ProductDiscountValue;
FETCH ProductDiscountValue INTO DiscValue, DiscType; 
RETURN DiscValue;
END

这给了我错误::

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第16行'DECLARE ProdDiscValue CURSOR FOR SELECT Discountvalue,DiscountType FROM discount'附近使用正确的语法。

我需要DiscValue和DiscType进行不同的计算。

任何帮助都将不胜感激

提前致谢。

2 个答案:

答案 0 :(得分:2)

即使我从未在MySQL中使用过CURSOR,但我发现它是在 MySQL manual

中明确提到的
  

游标声明必须出现在处理程序声明之前和之后   变量和条件声明。

如果你想在某些条件下使用那个光标,那么你必须在 IF 条件中使用 FETCH CURSOR 语法

下面是一些很好的教程,它将详细描述光标:

CURSOR in mySQL stored procedure

MySQL CURSOR Tutorial

答案 1 :(得分:0)

请使用它:

开始

IF test = true THEN
    BEGIN 
        DECLARE ats_cursor CURSOR FOR SELECT distinct ats_id FROM ats_eb ats where  ats.year = year and  ats.edition_shortname = edition;
    END;
ELSE
    BEGIN 
        DECLARE ats_cursor CURSOR FOR SELECT distinct ats_id FROM ats_eb ats where  ats.year = year and  ats.edition_shortname = edition;
    END;
END IF;

结束