3

私はこれに対する答えをオンラインで見つけようとしましたが、明確な説明を見つけることができませんでした:

ストアドプロシージャの@は、ある種の特別な目的を果たしますか/特に何かを意味しますか?使用方法によって例が異なるように見えるので、いつ使用するかについて少し混乱しています。

たとえば、次の例では@が使用されています。

DELIMITER $

DROP PROCEDURE IF EXISTS emp_count_2;

CREATE PROCEDURE emp_count_2(OUT param1 INT)
BEGIN
 SELECT COUNT(*) INTO param1 FROM Employee;
END
$
DELIMITER ;


/* To invoke this procedure use the mysql command statement
   CALL emp_count_2(@empCount);
   SELECT @empCount; 
*/

繰り返しになりますが、この例の@はある種の特別な目的を果たしますか、それとも@を削除して通常の変数名を使用できますか?

**編集:MySqlを使用しています

4

1 に答える 1

6

MySQLの@variable構文は、ユーザー定義のセッション変数を示します。これらのユーザー変数はストアドプロシージャの外部で設定できますが、ストアドプロシージャの内部で設定することもできます。その結果、プロシージャの呼び出しが戻った後も変数は値を保持します。

したがって、あなたの例では、以下も同じことをします:

CREATE PROCEDURE emp_count_2()
BEGIN
 SELECT COUNT(*) INTO @empCount FROM Employee;
END

CALL emp_count_2(); /* sets @empCount as a side-effect */
SELECT @empCount;

ユーザー変数のスコープは単一のセッションであり、同時セッションには同じ名前で値が異なる変数が含まれる可能性があるため、複数のセッションでこの方法でユーザー変数を同時に設定しても問題ありません。

@プレフィックスのない変数構文は、プロシージャのローカル変数、プロシージャパラメータ、またはプロシージャ本体内でDECLAREで宣言されたローカル変数用です。

ユーザー変数をパラメーターとして渡し、それをプロシージャの本体に割り当てるというこの使用法は、プロシージャを複数回呼び出して結果を個別のユーザー変数に格納する場合に役立ちます。そうしないと、プロシージャを呼び出すたびに、現在のセッションの@empCountユーザー変数の前の値が上書きされます。

于 2013-03-10T15:19:28.013 に答える