MySQLはストアドプロシージャからどのように結果セットを返しますか?


16

私は、Webアプリケーションで使用するストアドプロシージャを回避しようとしています。MySQLストアドプロシージャの最後のステートメントが何であれ、そのプロシージャの結果セットとして扱われるように思えます。残念ながら、MySQLドキュメントには、プロシージャが複数の結果セットを返すことができるという参照があるようです。この動作はどのようにトリガーされますか?1つの結果セットのみを明示的に返すようにMySQLサーバーに指示するにはどうすればよいですか?

(たとえば、SELECTといくつかの挿入を行うクエリがあります。挿入についてクライアントに伝えたくありませんが、クライアントにSELECTの結果セットを与えたいです...)

回答:


17

テーブルまたは変数に挿入しない各SELECTステートメントは、結果セットを生成します。

ストアドプロシージャが1つの結果セットのみを返すようにする場合は、SELECTステートメントが1つだけであることを確認してください。他のSELECTステートメントがある場合は、それらが結果をテーブルまたは変数に挿入することを確認してください。

更新
ストアドプロシージャの例を次に示します。

このストアドプロシージャは、1つの結果セットを返します。

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;
END;;
DELIMITER ;

このストアドプロシージャは、2つの結果セットを返します。

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;

    SELECT * FROM table_2;
END;;
DELIMITER ;

ああ、それがテーブルや変数に入る場合、結果として含まれませんか?どのようにアクセスしますか。SELECT INTOなどを使用しますか?
ビリーONeal

最初の質問にはい。2番目の質問については明確ではありません。ストアドプロシージャ内から値をローカル変数に保存する場合は、次のように実行しますSELECT column_name LIMIT 1 INTO local_variable_name;
dabest1

上記のサンプルクエリは次のとおりですSELECT column_name FROM table LIMIT 1 INTO local_variable_name;
dabest1

?私は別のストアドプロシージャから呼び出しstored_procedure_name後の変数を取得したい場合、私は、カーソル、コールget_info_user_visitstatisticsのDeclare c_deptのCURSOR()構文エラーを使用している場合、私は結果が=コールstored_procedure_nameは();,どのようにそれを解決するために設定することはできません
阿弥陀
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.