パラメータ付きのMySQLストアドプロシージャ

Preet Sanghavi 2023年6月20日
パラメータ付きのMySQLストアドプロシージャ

このチュートリアルでは、MySQL ストアド プロシージャについて説明し、パラメータを使用して、または使用せずにストアド プロシージャを作成する方法を示します。

パラメータ付きのMySQLストアドプロシージャ

ストアド プロシージャは、特定のタスクを実行するために定義するサブプログラムまたはコード ブロックです。 それらは、他のプログラミング言語の 関数 に似ています。

プロシージャはリレーショナル データベースに格納され、何度でも呼び出して使用できます。 ストアド プロシージャの作成中に名前を割り当てる必要があります。

さらに、パラメータを指定することもできます。 以下は、MySQL ストアド プロシージャを作成するための構文です。

MySQL ストアド プロシージャを作成する構文

CREATE
    [DEFINER = user]
    PROCEDURE [IF  NOT  EXISTS] procedure_name  ([procedure_parameters[,...]])
    [characteristic  ...]  routine_body
    procedure_parameters: [ IN | OUT | INOUT ] parameters_name type
    type : _Any valid MySQL _data type
    characteristic: {
    COMMENT  '_string_'
    | LANGUAGE  SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL  DATA | MODIFIES SQL  DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    }
routine_body: Valid SQL routine statement

上記の構文に圧倒される場合は、以下に示す上記の構文の単純なバージョンを参照できます。

DELIMITER {custom delimiter}
CREATE PROCEDURE procedure_name([IN | OUT | INOUT] param_1 [DATATYPE], ...)
BEGIN
// Your Code
END;
{custom delimiter}

MySQL ストアド プロシージャを呼び出す

次のコマンドを使用して、作成された MySQL ストアド プロシージャを呼び出すことができます。

call procedure_name(param_1, param2,...);

MySQL でストアド プロシージャを作成する際は、次の点に注意してください。

  1. CREATE PROCEDURE コマンドを使用して MySQL ストアド プロシージャを作成し、その後に procedure-name を付けます。 プロシージャ名は大文字と小文字が区別されません。つまり、new_procNEW_PROC は同じです。
  2. データベースに同じ名前のプロシージャを 2つ含めることはできません。
  3. プロシージャーの名前を区切ることができます。 名前が区切られている場合は、スペースを使用できます。
  4. プロシージャー名は 64 文字を超えてはなりません。
  5. MySQL のデフォルトの組み込み関数名をプロシージャ名として使用しないでください。 そうしないと、エラーが発生します。
  6. かっこ () のペアは、CREATE PROCEDURE の最後のコンポーネントを構成します。 括弧にはパラメーターが含まれます。 パラメータがない場合は、空の括弧を使用します。
  7. 次のセクションは、ステートメントが書かれている場所です。
  8. パラメータを OUTIN、または INOUT として指定します。これは、プロシージャに対してのみ有効です。 パラメータを渡したい場合は、この手順に従う必要があります。

MySQL ストアド プロシージャの IN パラメータ

IN パラメータは値をストアド プロシージャに渡します。

DELIMITER //
CREATE PROCEDURE simple_addition (IN param_1 INT, IN param_2 INT)
BEGIN
    SELECT param_1 + param_2;
END //
DELIMITER ;

CALL simple_addition(2,4); #produces 6 as output

出力:

param_1 + param_2
6

MySQL ストアド プロシージャの OUT パラメータ

ストアド プロシージャ内で OUT パラメータの値を更新できます。この値はさらに呼び出しプログラムに戻されます。

DELIMITER //
CREATE PROCEDURE simple_addition (IN param_1 INT, IN param_2 INT, OUT param_3 INT)
BEGIN
    SET param_3 = param_1 + param_2;
END //
DELIMITER ;

CALL simple_addition(2,4, @output_var);
SELECT @output_var;

出力:

@output_var
6

MySQL ストアド プロシージャの INOUT パラメータ

INOUT パラメータは、IN パラメータと OUT パラメータを組み合わせたものです。 呼び出し側プログラムは引数を渡すことができます。この引数はストアド プロシージャによって変更でき、呼び出し側プログラムに新しい値を返します。

DELIMITER //
CREATE PROCEDURE counter(INOUT set_counter INT, IN increment INT)
BEGIN
    SET set_counter = set_counter + increment;
END //
DELIMITER ;

SET @counter = 1;
CALL counter(@counter,2); -- 3
CALL counter(@counter,5); -- 8
SELECT @counter; -- 8

出力:

@counter
8

ここでは、入力パラメーターとして increment を使用していますが、set_counter は入力および出力パラメーターです。

MySQL ストアド プロシージャの特徴

MySQL では、作成しているプロシージャの特性を記述するためのアクセスが提供されます。

characteristic: {
    COMMENT  '_string_'
    | LANGUAGE  SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL  DATA | MODIFIES SQL  DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    }

これらの特性の後には括弧が続き、BEGIN 句が前に置かれます。 ただし、これらの特性はオプションです。 これらのコード行を毎回明示的に記述する必要はありません。

特性 説明
COMMENT ストアド ルーチンを説明するために使用されます。 すべての詳細は、SHOW CREATE PROCEDURE ステートメントによって表示されます。
LANGUAGE プロシージャの本体が SQL で記述されていることを示します。
[NOT] 決定的 ルーチンは、同じ入力パラメーターに対して一貫して同じ結果を生成する場合は決定的であると見なされ、そうでない場合は非決定的であると見なされます。
CONTAINS SQL これは、データの読み取りまたは書き込みを行うステートメントがルーチンに含まれていないことを示します。
NO SQL これは、プロシージャ内に NO SQL ステートメントが存在することを示します。
READS SQL データ この手順は、SELECT コマンドなど、データを読み取るステートメントのみで構成されています。
SQL データの変更 プログラムには、MODIFIES SQL DATA (たとえば、INSERT または DELETE) としてデータを書き込むことができるステートメントが含まれています。
`SQL セキュリティ{DEFINER 呼び出し側}`

特性句の上記の値はすべてデフォルトです。 たとえば、次の 2つのストアド プロシージャは同じ出力を生成します。

DELIMITER //
CREATE PROCEDURE procedure_name ()
BEGIN
    SELECT CURRENT_DATE();
END //
DELIMITER ;

call procedure_name(); -- 2022-09-05

上記のコードは、特性が明示的に言及されている場合と同じです。

DELIMITER //
CREATE PROCEDURE procedure_name ()
COMMENT ''
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
    SELECT CURRENT_DATE();
END //
DELIMITER ;

call procedure_name(); -- 2022-09-05

これで、MySQL のプロシージャでパラメータを使用する方法を学びました。

著者: Preet Sanghavi
Preet Sanghavi avatar Preet Sanghavi avatar

Preet writes his thoughts about programming in a simplified manner to help others learn better. With thorough research, his articles offer descriptive and easy to understand solutions.

LinkedIn GitHub

関連記事 - MySQL Stored Procedure