ホームページ >データベース >mysql チュートリアル >mysqlでストアドプロシージャを作成する方法
ストアド プロシージャ: プログラム可能な関数のセット。特定の関数を完了するための SQL ステートメントのセットです。これらはコンパイルされ、作成され、データベースに保存されます。ユーザーはストアド プロシージャの名前を指定し、パラメータを指定できます (必須)実行を呼び出します。
推奨コース: MySQL チュートリアル 。
利点 (ストアド プロシージャを使用する理由):
① 反復性の高い操作をストアド プロシージャにカプセル化し、これらの 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. ストアド プロシージャのパラメータ
ストアド プロシージャには 0 個以上のパラメータを含めることができ、ストアド プロシージャの定義に使用されます。
3 パラメータ タイプ:
IN 入力パラメータ: 呼び出し元がプロセスに値を渡すことを示します (渡される値はリテラルまたは変数にすることができます)
OUT 出力パラメータ: プロセスが呼び出し元に値を渡すことを示します (複数の値を返すことができます) (送信される値は変数のみにすることができます)
INOUT 入出力パラメーター: 呼び出し元が値を呼び出し元に渡すことだけを意味するわけではありません。これはプロセスですが、プロセスが呼び出し元に値を渡す、または値を渡すことも意味します (値は変数のみ可能です)
1. 入力パラメータ
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 値には影響しません。
2. Out 出力パラメータ
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变量的值
3. Inout 入力パラメータ
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 ストアド プロシージャが呼び出され、入力パラメータを受け取り、パラメータを出力し、パラメータを変更します。変数
注:
①プロセスにパラメーターがない場合は、プロセス名の後にかっこも記述する必要があります
例: CREATE PROCEDURE sp_name ([proc_parameter[,... ] ]) ......
②パラメータの名前が列の名前と等しくないことを確認してください。そうでない場合、プロシージャ本体でパラメータ名が列名として扱われます
強く推奨:
>入力値には in パラメータを使用します;
>戻り値には out パラメータを使用します;
>inout パラメータは次のように使用しますできるだけ少なく。
以上がmysqlでストアドプロシージャを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。