0

状況は、いくつかの変数を持つmysqlストアドプロシージャがあり、ループで本当に必要な変数のリストを取得するために行うSELECTに基づいてそれらの値を使用したいということです:

MyTable(varId, varName, typeId)  
(0,var1,1)  
(1,var2,2)

MyValues(MyVar1,MyVar2)
(1,2)

これが私がやりたいことです:

DECLARE var1 ;  
DECLARE var2 ;  

SELECT MyVar1,MyVar2 INTO var1,var2 FROM MyValues; 
CURSOR curs FOR  
SELECT varName FROM Mytable WHERE typeId = 1;

LOOP  
FETCH curs INTO varName;  
  SELECT sqrt(varName.value);  //Should be 1 because var1 =1;
END LOOP;

セッション変数を使用しない限り、準備された関数でそれを行うことは不可能のようですが、実際にはvar1and をvar2動的に (curs で) 受け取り、それをセッション変数にフェッチすることはできません。

この問題を解決するためのアイデアを教えてもらえますか? どうもありがとう!

4

1 に答える 1

0

まず、なぜ変数を SESSION に保存したいのでしょうか? プロシージャ内で取得できる場合は、プロシージャ内で使用することもできます。

繰り返しになりますが、それらを返す必要がある場合は、プロシージャ内で結果セットを返し、Web プログラミングまたはアプリケーションでそれらをキャッチできます。お気に入り:

SELECT @var1, @var2

もう1つ、私はあなたが正しいかどうか確信が持てませんが、外部(Webアプリケーション)から変数が必要な場合は、それらをパラメーターとして渡すこともできます. お気に入り:

$mysqli->query("CALL procedure_name($parameter1, $parameter2)");

質問の編集後: 私はこれを理解していません..

CURSOR curs FOR  
SELECT varName FROM Mytable WHERE typeId = 1;

LOOP  

選択するためだけにここでカーソルを使用するのはなぜですか? とにかく、次の行で' varName 'を使いたいと思います。次のような別の変数に格納できます。

DECLARE a_variable VARCHAR(50);
SELECT varName INTO a_variable FROM Mytable WHERE typeId = 1;

ここで *a_variable* 内の値を取得します。

SELECT sqrt(a_variable);//NOT like varName.value

これはあなたの質問に答えていますか?私にお知らせください。

編集#3: ここであなたの質問を間違えました:

//var1 =1 であるため、1 である必要があります。

使用する必要があるコードは次のとおりです。

SET @query = CONCAT('select SQRT(@', var_name, ') as square_root');
     -- SELECT @query;
    PREPARE stmt FROM @query;
    EXECUTE stmt;

これを試した完全な手順は次のとおりです。

DELIMITER $$

CREATE PROCEDURE `test_var`(
)
BEGIN
    DECLARE var1 int;  
    DECLARE var2 int; 
    DECLARE var_name varchar(50);

    SELECT MyVar1,MyVar2 INTO @var1,@var2 FROM MyValues;
    SELECT varName INTO var_name FROM Mytable WHERE typeId = 1;

    SET @query = CONCAT('select SQRT(@', var_name, ') as square_root');
     -- SELECT @query;
    PREPARE stmt FROM @query;
    EXECUTE stmt;

END

お役に立てれば。私にお知らせください。

よろしくマユク

于 2013-03-05T18:02:44.637 に答える