パラメータ付きの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 でストアド プロシージャを作成する際は、次の点に注意してください。
CREATE PROCEDURE
コマンドを使用して MySQL ストアド プロシージャを作成し、その後にprocedure-name
を付けます。 プロシージャ名は大文字と小文字が区別されません。つまり、new_proc
とNEW_PROC
は同じです。- データベースに同じ名前のプロシージャを 2つ含めることはできません。
- プロシージャーの名前を区切ることができます。 名前が区切られている場合は、スペースを使用できます。
- プロシージャー名は 64 文字を超えてはなりません。
- MySQL のデフォルトの組み込み関数名をプロシージャ名として使用しないでください。 そうしないと、エラーが発生します。
- かっこ
()
のペアは、CREATE PROCEDURE
の最後のコンポーネントを構成します。 括弧にはパラメーターが含まれます。 パラメータがない場合は、空の括弧を使用します。 - 次のセクションは、ステートメントが書かれている場所です。
- パラメータを
OUT
、IN
、または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 のプロシージャでパラメータを使用する方法を学びました。