8

MySQLカーソルから値をフェッチする際に問題が発生しました。

別のテーブルの単なるコピーである一時テーブルを作成します(元のテーブルには変数名があり、プロシージャのパラメーターとして渡されます。MySQLは変数テーブル名をサポートしていないため、コピーを作成する必要があります-できませんオリジナルを直接使用してください)。

一時テーブルの作成は問題なく行われ、そこにあるはずのすべてのデータがそこにあります。次に、一時テーブルを反復処理するカーソルを定義します...しかし、whileループでカーソルからフェッチしようとすると、変数は「cursored」テーブルからのデータで満たされません...それらのほとんどはNULLです。最後の2つだけが正しい値を持っているようです。

これが私のコードのチャンクです:

-- variables to be filled from the cursor
DECLARE id,rain,snow,hs,clouds,rain2,cape,status,done int;
DECLARE v_v,v_u double;

-- cursor declaration
DECLARE iter CURSOR FOR (SELECT id,cape,rain,snow,hstones,clouds,raining,wind_u,wind_v FROM temp_tbl);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

-- drop the old temporary table if any
DROP TABLE IF EXISTS temp_tbl;

-- a statement to create the temporary table from a table with the specified name
-- (table_name is a parameter of the stored procedure this chunk is from)

SET @temp_table = CONCAT('CREATE TABLE temp_tbl AS SELECT * FROM ', table_name, ' WHERE 1'); 

-- prepare, execute and deallocate the statement
PREPARE ctmp FROM @temp_table;
EXECUTE ctmp;
DEALLOCATE PREPARE ctmp;

-- now the temp_table exists, open the cursor
OPEN iter;

WHILE NOT done DO

        -- fetch the values
        FETCH iter INTO id,cape,rain,snow,hs,clouds,rain2,v_u,v_v;

        -- fetch doesnt work, only v_u and v_v variables are fetched correctly, others are null

        -- ... further statements go here

END WHILE;

CLOSE iter;

そのような問題を引き起こす可能性のあるFETCHステートメント内のタイプチェックはありますか?私の一時テーブル(元のテーブルから派生)の列は、small-intまたはtiny-intであるため、これらは、fetchステートメントで使用するintと完全に互換性があるはずです。最後の2つはダブルですが、これら2つのダブルだけがフェッチされるのは奇妙です。主キーであるIDint列もフェッチされません。

私はdbForgeStudioを使用して手順にステップインし、デバッグしますが、それは問題ではないはずです。

4

1 に答える 1

16

関数ではMySQL、パラメーター名または変数名がフィールド名と競合する場合、パラメーター名または変数名が使用されます。

これらのステートメントでは:

DECLARE id,rain,snow,hs,clouds,rain2,cape,status,done int;

DECLARE iter CURSOR FOR (SELECT id,cape,rain,snow,hstones,clouds,raining,wind_u,wind_v FROM temp_tbl);

フィールドではなく、初期化されていない変数を選択します。これは、次のことと同じです。

DECLARE iter CURSOR FOR (SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, wind_u,wind_v FROM temp_tbl);

最後の2つのフィールド名は競合せず、正しく選択されています。

Prepend the variable names with an underscore:

DECLARE _id, _rain, _snow, _hs, _clouds, _rain2, _cape, _status, _done INT;
于 2010-02-25T15:17:12.750 に答える