ホームページ >データベース >mysql チュートリアル >mysqlストアドプロシージャのパラメータタイプは何ですか?

mysqlストアドプロシージャのパラメータタイプは何ですか?

青灯夜游
青灯夜游オリジナル
2022-01-24 18:36:2312586ブラウズ

mysql ストアド プロシージャには 3 つのパラメータ タイプがあります: 1. 「IN」キーワードで識別される入力パラメータはストアド プロシージャに渡すことができます; 2. 「OUT」キーワードで識別される出力パラメータused ストアド プロシージャが操作結果を返す必要がある状況 3. 入力パラメータと出力パラメータは、「INOUT」キーワードで識別されます。

mysqlストアドプロシージャのパラメータタイプは何ですか?

このチュートリアルの動作環境: 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 パラメータ タイプ:

  • IN 入力パラメータ: 呼び出し元がプロセスに値を渡すことを示します (渡された値はリテラルまたは変数)

  • OUT 出力パラメータ: プロセスが呼び出し元に値を渡すことを示します (複数の値を返すことができます) (送信される値は変数のみにすることができます)

  • INOUT 入力パラメータと出力パラメータ: これは、呼び出し元がプロセスに値を渡すことを意味するだけでなく、プロセスが呼び出し元に値を渡すことも意味します (値は変数のみにすることができます)。

#1.in 入力パラメータ

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[,...]]) ……

②パラメータの名前が列の名前と等しくないことを確認してください。そうでない場合、プロシージャ本体のパラメータ名は次のようになります。カラム名として扱われます

[関連する推奨事項:

mysql ビデオ チュートリアル

]

以上がmysqlストアドプロシージャのパラメータタイプは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。