ホームページ > データベース > mysql チュートリアル > MySQL ストアド プロシージャの結果セットの詳細な説明

MySQL ストアド プロシージャの結果セットの詳細な説明

PHPz
リリース: 2023-04-21 11:45:41
オリジナル
2853 人が閲覧しました

MySQL ストアド プロシージャは、コンパイルされてデータベースに保存される一連の SQL ステートメントであり、繰り返し呼び出すことができます。ストアド プロシージャは、パラメーターを受け取り、一連の操作を実行し、複数の方法で結果を返すことができます。この記事では主にMySQLストアドプロシージャの結果セットを紹介します。

1. MySQL ストアド プロシージャの結果セット

MySQL ストアド プロシージャの結果セットは、次のいずれかの方法で返すことができます:

  1. RETURN ステートメント

ストアド プロシージャは、RETURN ステートメントを使用して、整数、浮動小数点数、日付、時刻、文字列などの値を返すことができます。ストアド プロシージャが結果を返さない場合は、RETURN ステートメントを使用してストアド プロシージャの実行を終了できます。

たとえば、次のストアド プロシージャは 2 つの入力パラメータの積を返します。

CREATE PROCEDURE myProc(IN a INT, IN b INT)
BEGIN
    DECLARE result INT;
    SET result = a * b;
    RETURN result;
END;
ログイン後にコピー
  1. OUT パラメータ

ストアド プロシージャは OUT パラメータを使用して、次のことを行うことができます。 1 つ以上の値を返します。 OUT パラメータはストアド プロシージャのパラメータ リストで宣言し、ストアド プロシージャ内で割り当てる必要があります。ストアド プロシージャが終了すると、呼び出し元はこれらの値を取得できます。

たとえば、次のストアド プロシージャは 2 つの入力パラメータの合計と差を返します。

CREATE PROCEDURE myProc(IN a INT, IN b INT, OUT sum INT, OUT difference INT)
BEGIN
    SET sum = a + b;
    SET difference = a - b;
END;
ログイン後にコピー
  1. SELECT ステートメント

ストアド プロシージャでは、 SELECT ステートメントを使用して、1 つまたは複数の結果セットを返します。結果セットには 1 つ以上のデータ行を含めることができ、各行は一連のフィールドで構成されます。

たとえば、次のストアド プロシージャは、Employee テーブル内のすべての従業員情報を返します。

CREATE PROCEDURE myProc()
BEGIN
    SELECT * FROM Employee;
END;
ログイン後にコピー
  1. SET ステートメント

ストアド プロシージャでは、SET ステートメントを使用できます。ユーザー変数を返すステートメント。ユーザー変数には、整数、浮動小数点数、日付、文字列など、あらゆる種類の値を格納できます。

たとえば、次のストアド プロシージャは、Employee テーブル内の従業員名を返します:

CREATE PROCEDURE myProc(IN employeeID INT, OUT employeeName VARCHAR(255))
BEGIN
    SELECT name INTO @employeeName FROM Employee WHERE ID = employeeID;
    SET employeeName = @employeeName;
END;
ログイン後にコピー

2. MySQL ストアド プロシージャによる結果セットの処理方法

ストアド プロシージャは、結果セットを処理するには、次のメソッドを使用します。

  1. ループ

ストアド プロシージャは、ループを使用して結果セット内のデータの各行を走査し、データを処理できます。

たとえば、次のストアド プロシージャは、Employee テーブル内のすべての従業員名を返します。

CREATE PROCEDURE myProc()
BEGIN
    DECLARE employeeName VARCHAR(255);
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur CURSOR FOR SELECT name FROM Employee;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    OPEN cur;
    
    get_employee: LOOP
        FETCH cur INTO employeeName;
        
        IF done THEN
            LEAVE get_employee;
        END IF;
        
        SELECT employeeName;
    END LOOP;
    
    CLOSE cur;
END;
ログイン後にコピー
  1. Cursor

ストアド プロシージャは、カーソルを使用して次のことを行うことができます。データの各行の結果セットを走査し、データを処理します。

たとえば、次のストアド プロシージャは、Employee テーブル内のすべての従業員名を返します。

CREATE PROCEDURE myProc()
BEGIN
    DECLARE employeeName VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT name FROM Employee;
    
    OPEN cur;
    
    get_employee: LOOP
        FETCH cur INTO employeeName;
        
        IF done THEN
            LEAVE get_employee;
        END IF;
        
        SELECT employeeName;
    END LOOP;
    
    CLOSE cur;
END;
ログイン後にコピー
  1. サブクエリ

ストアド プロシージャは、サブクエリを使用して処理できます。結果セット内の行と列のデータ。サブクエリでは、ストアド プロシージャの結果セットを他のクエリに結合できます。

たとえば、次のストアド プロシージャは、Employee テーブル内のすべての従業員情報を返します:

CREATE PROCEDURE myProc()
BEGIN
    SELECT *
    FROM Employee
    WHERE departmentID = (
        SELECT ID FROM Department WHERE name = 'Sales'
    );
END;
ログイン後にコピー

3. MySQL ストアド プロシージャの結果セットの最適化

ストアド プロシージャは、結果セットの処理を最適化するには、次のテクニックを使用します。

  1. インデックスの使用

ストアド プロシージャはインデックスを使用して、結果セットのクエリを高速化できます。 MySQL は、B ツリー、ハッシュ、フルテキスト インデックスを含む複数のインデックス タイプをサポートしています。

たとえば、次のストアド プロシージャでは、Employee テーブルの ID フィールドを使用してインデックスを作成できます:

CREATE INDEX idx_employee ON Employee(ID);
ログイン後にコピー
  1. 結果セットの数を制限する

ストアド プロシージャでは、LIMIT ステートメントを使用して結果セットの数を制限できます。これにより、ストアド プロシージャの実行時間とメモリ フットプリントを削減できます。

たとえば、次のストアド プロシージャでは、LIMIT ステートメントを使用して最初の 10 人の従業員の情報を返すことができます。

CREATE PROCEDURE myProc()
BEGIN
    SELECT *
    FROM Employee
    LIMIT 10;
END;
ログイン後にコピー
  1. メモリ テーブルの使用

ストアド プロシージャはメモリ テーブルを使用して一時的な結果セットを作成できます。インメモリ テーブルは一般にディスク テーブルよりも高速ですが、ディスク テーブルよりも多くのメモリ領域を消費します。

たとえば、次のストアド プロシージャでは、メモリ エンジンを使用して一時的な結果セットを作成できます:

CREATE TEMPORARY TABLE tempEmployee ENGINE=MEMORY
SELECT * FROM Employee;
ログイン後にコピー

以上がMySQL ストアド プロシージャの結果セットの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート