mysql ストアド プロシージャには 3 つのパラメータ タイプがあります: 1. 「IN」キーワードで識別される入力パラメータはストアド プロシージャに渡すことができます; 2. 「OUT」キーワードで識別される出力パラメータused ストアド プロシージャが操作結果を返す必要がある状況 3. 入力パラメータと出力パラメータは、「INOUT」キーワードで識別されます。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
ストアド プロシージャ:
プログラム可能な関数のセット、特定の関数を完了するためにコンパイルされる SQL ステートメントのセット。データベースに保存すると、ユーザーはストアド プロシージャの名前を指定し、パラメータを (必要に応じて) 与えることで、それを呼び出して実行できます。
利点 (ストアド プロシージャを使用する理由):
① 反復性の高い操作をストアド プロシージャにカプセル化し、これらの SQL の呼び出しを簡素化します
② バッチ処理: SQL ループトラフィック、つまり「バッチの実行」を削減します。
③データセキュリティを確保するための統合インターフェイス
Oracle データベースと比較すると、MySQL のストアド プロシージャは比較的強力で、あまり使用されていません。
1. ストアド プロシージャの作成と呼び出し
>ストアド プロシージャは名前が付いたコードの一部であり、ストアド プロシージャを完了するために使用されます。特定の機能。
>作成したストアドプロシージャはデータベースのデータディクショナリに保存されます。
1. ストアド プロシージャを作成します
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name 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 [begin_label:] BEGIN [statement_list] …… END [end_label]
#データベースを作成し、操作例のためにデータ テーブルをバックアップします
mysql> create database db1; mysql> use db1; mysql> create table PLAYERS as select * from TENNIS.PLAYERS; mysql> create table MATCHES as select * from TENNIS.MATCHES;
例: ストアド プロシージャを作成する指定したプレーヤーがプレイしたすべてのゲーム
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义) mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) -> BEGIN -> DELETE FROM MATCHES -> WHERE playerno = p_playerno; -> END$$ Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; #将语句的结束符号恢复为分号
分析:
デフォルトでは、ストアド プロシージャはデフォルトのデータベースに関連付けられます。ストアド プロシージャが次の場所に作成されるように指定したい場合は、特定のデータベースを指定し、プロシージャ名の前にデータベース名を付けます;
プロシージャを定義するときに、DELIMITER $$ コマンドを使用して、ステートメントの終了記号をセミコロン; から 2 つの $$ に一時的に変更します。そのため、プロシージャ本体で使用されるセミコロンは、クライアント (mysql など) によって解釈されることなく、サーバーに直接渡されます。
2. ストアド プロシージャを呼び出します: call sp_name[(パラメーター受け渡し)];
mysql> select * from MATCHES; +---------+--------+----------+-----+------+ | MATCHNO | TEAMNO | PLAYERNO | WON | LOST | +---------+--------+----------+-----+------+ | 1 | 1 | 6 | 3 | 1 | | 7 | 1 | 57 | 3 | 0 | | 8 | 1 | 8 | 0 | 3 | | 9 | 2 | 27 | 3 | 2 | | 11 | 2 | 112 | 2 | 3 | +---------+--------+----------+-----+------+ 5 rows in set (0.00 sec) mysql> call delete_matches(57); Query OK, 1 row affected (0.03 sec) mysql> select * from MATCHES; +---------+--------+----------+-----+------+ | MATCHNO | TEAMNO | PLAYERNO | WON | LOST | +---------+--------+----------+-----+------+ | 1 | 1 | 6 | 3 | 1 | | 8 | 1 | 8 | 0 | 3 | | 9 | 2 | 27 | 3 | 2 | | 11 | 2 | 112 | 2 | 3 | +---------+--------+----------+-----+------+ 4 rows in set (0.00 sec)
分析:
必要なパラメーターを設定します。ストアド プロシージャに渡されるパラメータ変数 p_playerno は、ストアド プロシージャを呼び出すときに、パラメータを渡すことで p_playerno に 57 を代入し、ストアド プロシージャ内で SQL 操作を実行します。
3. ストアド プロシージャ本体
>ストアド プロシージャ本体には、プロシージャの呼び出し時に実行する必要があるステートメント (dml、ddl ステートメント、if など) が含まれます。 -then-else および while-do ステートメント、変数を宣言するための宣言ステートメントなど。
>プロシージャ本体の形式: begin で始まり end で終わる (ネスト可能)
BEGIN BEGIN BEGIN statements; END END END
注: 各ネスト ブロックとその中の各ステートメントはセミコロンで終わる必要がありますが、プロシージャ本体の終わりを示す begin-end ブロック (複合ステートメントとも呼ばれます) にはセミコロンは必要ありません。
4. ステートメント ブロックにラベルを付ける
[begin_label:] BEGIN [statement_list] END [end_label]
例:
label1: BEGIN label2: BEGIN label3: BEGIN statements; END label3 ; END label2; END label1
ラベルには 2 つの機能があります:
① 機能を強化するコードの可読性
## ②一部のステートメント (例: Leave ステートメントと iterate ステートメント) では、ラベル# を使用する必要があります。 2. ストアド プロシージャのパラメータ
ストアド プロシージャには 0 個以上のパラメータを含めることができ、ストアド プロシージャの定義に使用されます。MySQL ストアド プロシージャは、入力パラメータ、出力パラメータ、入出力パラメータという 3 種類のパラメータをサポートしており、それぞれ IN、OUT、INOUT の 3 つのキーワードで識別されます。 このうち、入力パラメータはストアド プロシージャに渡すことができ、出力パラメータはストアド プロシージャが演算結果を返す必要がある場合に使用され、入出力パラメータは入力パラメータと出力パラメータの両方として機能します。
3 パラメータ タイプ:
mysql> delimiter $$
mysql> create procedure in_param(in p_in int)
-> begin
-> select p_in;
-> set p_in=2;
-> select P_in;
-> end$$
mysql> delimiter ;
mysql> set @p_in=1;
mysql> call in_param(@p_in);
+------+
| p_in |
+------+
| 1 |
+------+
+------+
| P_in |
+------+
| 2 |
+------+
mysql> select @p_in;
+-------+
| @p_in |
+-------+
| 1 |
+-------+
#以上可以看出,p_in在存储过程中被修改,但并不影响@p_id的值,因为前者为局部变量、后者为全局变量。
mysql> delimiter // mysql> create procedure out_param(out p_out int) -> begin -> select p_out; -> set p_out=2; -> select p_out; -> end -> // mysql> delimiter ; mysql> set @p_out=1; mysql> call out_param(@p_out); +-------+ | p_out | +-------+ | NULL | +-------+ #因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null +-------+ | p_out | +-------+ | 2 | +-------+ mysql> select @p_out; +--------+ | @p_out | +--------+ | 2 | +--------+ #调用了out_param存储过程,输出参数,改变了p_out变量的值
mysql> delimiter $$ mysql> create procedure inout_param(inout p_inout int) -> begin -> select p_inout; -> set p_inout=2; -> select p_inout; -> end -> $$ mysql> delimiter ; mysql> set @p_inout=1; mysql> call inout_param(@p_inout); +---------+ | p_inout | +---------+ | 1 | +---------+ +---------+ | p_inout | +---------+ | 2 | +---------+ mysql> select @p_inout; +----------+ | @p_inout | +----------+ | 2 | +----------+ #调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量
mysql ビデオ チュートリアル
]以上がmysqlストアドプロシージャのパラメータタイプは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。