【问题标题】:Is it Possible to declare Cursor within IF Condition in MySQL UDF是否可以在 MySQL UDF 中的 IF 条件内声明游标
【发布时间】:2013-06-03 07:59:13
【问题描述】:

我可以在 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 进行不同的计算。

任何帮助将不胜感激

提前致谢。

【问题讨论】:

    标签: php mysql sql-server database


    【解决方案1】:

    请使用它:

    开始

    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;
    

    结束

    【讨论】:

    • 你是超级明星
    【解决方案2】:

    即使我到目前为止从未在 MySQL 中使用过 CURSOR,但我发现,它在 MySQL manual 上明确提到过

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

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

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

    CURSOR in mySQL stored procedure

    MySQL CURSOR Tutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2016-12-10
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多