4

OUTMySQLストアドプロシージャの目的は何ですか?

次のような単純なストアドプロシージャがある場合:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int
)
BEGIN
    select * from table1 where id = iID;
END

これにより、次のコマンドを実行して、必要なすべての結果が得られます。

call new_routine(7);

では、なぜ私は使用したい/使用する必要があるのでしょうOUTか?

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int,
    OUT vName varchar(100)
)
BEGIN
    select name into vName from table1 where id = iID;
END

このように呼んでください

call new_routine(7, @name);
select @name;

返された行のすべてではなく、名前だけが表示されますか?

私はグーグルを試しましたが、明確な答えを得るためにグーグルに正しい質問をしていないことは明らかです。

4

4 に答える 4

7

MySQLドキュメントから引用されているようにPROCEDURE

OUTまたはINOUTパラメーターごとに、プロシージャーを呼び出すCALLステートメントでユーザー定義変数を渡して、プロシージャーが戻ったときにその値を取得できるようにします。別のストアドプロシージャまたは関数内からプロシージャを呼び出す場合は、ルーチンパラメータまたはローカルルーチン変数をINまたはINOUTパラメータとして渡すこともできます。


そして後で、例:

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)
于 2013-03-26T10:49:52.680 に答える
5

ええ、あなたは正しいです、その2番目の呼び出しで、あなたは今名前自体だけを得るでしょう。

多くの人にとってアウトパラメータは一般的に悪い習慣と考えられていますが、呼び出し後に使用できる値が必要な場合は便利です(これは明らかに関数によって計算することもできます)。そしてほとんどの場合、アウトパラメータを使用せずにあなたが望むものを達成するためのより良い方法があります。

ただし、唯一の「利点」は、結果セットではなく変数に値があることです。これは、SQLでその値のみを使用する場合や、SQLで作業する場合に便利に思えるかもしれません。

したがって、ほとんどの場合、実際には出力パラメータを使用するべきではなく、代わりに関数を使用してください。結果セットと出力パラメータを返すプロシージャがある場合は、それらをより小さな関数/プロシージャに分割して、出力パラメータを回避しようとします。これは、読み取りと保守が適切ではないためです;)

于 2013-03-26T11:01:52.117 に答える
2

いくつかのドキュメント:http ://dev.mysql.com/doc/refman/5.0/en/call.html多分それは役立つでしょう、引用:

OUTまたはINOUTパラメータを使用してプロシージャから値を取得するには、ユーザー変数を使用してパラメータを渡し、プロシージャが戻った後に変数の値を確認します。(別のストアード・プロシージャーまたは関数内からプロシージャーを呼び出す場合は、ルーチン・パラメーターまたはローカル・ルーチン変数をINまたはINOUTパラメーターとして渡すこともできます。)INOUTパラメーターの場合、その値を初期化してからプロシージャーに渡します。次のプロシージャには、プロシージャが現在のサーバーバージョンに設定するOUTパラメータと、プロシージャが現在の値から1ずつインクリメントするINOUT値があります。

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
  # Set value of OUT parameter
  SELECT VERSION() INTO ver_param;
  # Increment value of INOUT parameter
  SET incr_param = incr_param + 1;
END;
于 2013-03-26T10:49:45.090 に答える
0

OUTキーワードの使用については、次の記事で説明しています。

13.2.1。CALL構文

CALLは、OUTまたはINOUTパラメーターとして宣言されたパラメーターを使用して、呼び出し元に値を戻すことができます。

于 2013-03-26T10:50:01.417 に答える