2014-02-16 48 views
1

準備好的發言,我把準備好的語句的遊標聲明,然後執行它,然後返回一個error #1324 - Undefined CURSOR: getid.使用帶有光標

我該如何解決這個問題?

 
delimiter ;; 

drop procedure if exists test2;; 

create procedure test2(table_id VARCHAR(25)) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE id INT; 
    DECLARE id_new INT; 
    DECLARE stmt1 VARCHAR(1024); 
    DECLARE stmt2 VARCHAR(1024); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    SET @sqltext1 := CONCAT('DECLARE getid CURSOR FOR SELECT entryId FROM ',table_id,' ORDER BY entryId'); 
    PREPARE stmt1 FROM @sqltext1; 
    EXECUTE stmt1; 

    SET @id_new = 1; 

    OPEN getid; 

    FETCH getid into id; 
    REPEAT 
     SET @sqltext2 := CONCAT('UPDATE ',table_id,' SET entryId = ? WHERE entryId = ?'); 
     PREPARE stmt2 FROM @sqltext2; 
     EXECUTE stmt2 USING @new_id, id; 
     SET @id_new = @id_new + 1; 
     FETCH getid into id; 
    UNTIL done END REPEAT; 
    CLOSE getid; 
END 
;; 

CALL test2('Test'); 

回答

4

一些規則:

  1. 所有聲明必須在序列中的一個地方。
  2. 您不能在光標聲明中使用變量名稱。
  3. 處理程序聲明必須位於遊標聲明之後。
  4. 您不能使用本地變量名稱(id)作爲 準備語句的綁定參數。您只能使用session變量(如@_id)。

爲了克服這些問題,您可以採用以下解決方案。

  1. 使用SP的輸入參數定義臨時表。
  2. 現在將光標聲明在同一張桌子上並使用它。
  3. 刪除創建的臨時表。

下面的例子應該在你的表上工作。

delimiter $$ 

drop procedure if exists test2$$ 

create procedure test2(table_id varchar(25)) 
begin 
    set @temp_query = 'drop temporary table if exists temp_cursor_table'; 
    prepare pst from @temp_query; 
    execute pst; 
    drop prepare pst; -- or 
    -- deallocate prepare pst; 

    set @temp_table_query='create temporary table temp_cursor_table '; 
    set @temp_table_query=concat(@temp_table_query, ' select entryId from '); 
    set @temp_table_query=concat(@temp_table_query, table_id); 
    set @temp_table_query=concat(@temp_table_query, ' order by entryId'); 

    prepare pst from @temp_table_query; 
    execute pst; 
    drop prepare pst; 

    -- now write your actual cursor and update statements 
    -- in a separate block 
    begin 
    declare done int default false; 
    declare id int; 
    declare id_new int; 
    declare stmt1 varchar(1024); 
    declare stmt2 varchar(1024); 

    declare getid cursor for 
       select entryId from temp_cursor_table order by entryId; 
    declare continue handler for not found set done = 1; 

    set @id_new = 1; 

    open getid; 
    fetch getid into id; 
    repeat 
     set @sqltext2 := concat('update ', table_id); 
     set @sqltext2 := concat(@sqltext2, ' set entryId = ? where entryId = ?'); 
     set @_id = id; 
     prepare stmt2 from @sqltext2; 
     execute stmt2 using @new_id, @_id; 
     set @id_new = @id_new + 1; 
     fetch getid into id; 
    until done end repeat; 
    close getid; 
    end; 
end; 
$$ 

delimiter ; 

現在調用table_id值的過程。

call test2('Test'); 
+0

謝謝。但它返回#1327 - 未聲明的變量:id。我通過phpmyadmin導入它。 – user3274165

+0

我沒有問題來創建過程,但是當我調用它時,它返回#1193 - 未知的系統變量'entryId',我該如何解決它?再次感謝 – user3274165

+0

'set @ sqltext2:= concat('set entryId =?where entryId =?');'是問題所在。固定。更新了我的答案。 –