2012-06-11 130 views
3

我正在为这个问题疯狂。MySQL光标无法正常工作

下面的存储过程打开一个游标,然后对结果进行迭代以执行一些插入操作。

在游标外部使用(在sql窗口中)时,用于游标的select语句有效。但是在游标中并不是工作,游标在打开时返回NULL!

请注意,此代码位于存储过程中,该存储过程本身是由另一个打开另一个游标的存储过程调用的。不确定这个信息。是有用的。

DECLARE location VARCHAR(255);      -- location 
DECLARE isLocationDone BOOL DEFAULT FALSE; -- status flag 
DECLARE curLocation CURSOR FOR 
    SELECT `LOCATION` AS loc FROM `mfdtemp`.`opexstk_tmp` 
    WHERE `client` = in_client AND DATE(`rentdat`) < in_date 
    ORDER BY loc; 
DECLARE 
    CONTINUE HANDLER FOR SQLSTATE '02000' SET isLocationDone = TRUE; 

OPEN curLocation; 

label_location_loop: LOOP 

    FETCH curLocation INTO location; 

    IF isLocationDone THEN 
     CLOSE curLocation; 
     LEAVE label_location_loop; 
    END IF; 


    INSERT INTO t01_stock_report_htry (
     t01date, t01client, t01desc 
    ) 
    VALUES (in_date, in_client, CONCAT_WS('', 'Stack ', location) 
    ); 

END LOOP; 
+1

我想通了。不知道它是否是一个MySQL错误,但它是非常阴险的。 游标不工作,因为我已经声明了一个变量*位置*,并且我的游标正在使用一个也称为*'LOCATION' *的字段。 一旦我重命名光标正在工作的变量。 – Telemat

回答

1

为什么不只是使用INSERT ... SELECT

INSERT INTO t01_stock_report_htry (t01date, t01client, t01desc) 
    SELECT in_date, in_client, CONCAT('Stack ', LOCATION) 
    FROM  mfdtemp.opexstk_tmp 
    WHERE client = in_client AND DATE(rentdat) < in_date 
    ORDER BY LOCATION 
+0

不要担心INSERT语句,它仅用于说明目的。我的问题是与光标。 – Telemat

+0

@Telemat:或许一个更好的例子会显示你如何确定“*游标在打开时返回NULL”*“? – eggyal

+0

@Telemat:这不是一个错误,这是预期的行为。 – eggyal