2012-06-11 128 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