MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

序文

ストアドプロシージャ:

プログラム可能な関数のセットは、特定の機能を実行するための SQL ステートメントのセットです。これらはコンパイルされ、作成され、データベースに保存されます。ユーザーは、ストアド プロシージャの名前を指定し、パラメーター (必要な場合) を指定して、これらを呼び出して実行できます。

利点 (ストアド プロシージャを使用する理由):

1. 反復性の高い操作をストアドプロシージャにカプセル化して、これらのSQLの呼び出しを簡素化する

2. バッチ処理: SQL + ループ、トラフィックの削減、「バッチの実行」とも呼ばれます

3. データセキュリティを確保するための統一インターフェース

Oracle データベースと比較すると、MySQL ストアド プロシージャは比較的弱く、あまり使用されていません。

1. ストアドプロシージャの作成と呼び出し

  • ストアド プロシージャは、特定の機能を実行するために使用される、名前の付いたコードです。
  • 作成されたストアド プロシージャは、データベースのデータ ディクショナリに保存されます。

1. ストアドプロシージャを作成する

作成する
    [定義者 = { ユーザー | 現在のユーザー }]
 プロシージャ sp_name ([proc_parameter[,...]])
    [特性...] ルーチン本体
プロシージャパラメータ:
    [ IN | OUT | INOUT ] パラメータ名 タイプ
特徴:
    コメント '文字列'
  | 言語 SQL
  | [非]決定論的
  | { SQL を含む | SQL を含まない | SQL データを読み取る | SQL データを変更する }
  | SQL セキュリティ { 定義者 | 呼び出し者 }
ルーチン本体:
  有効なSQLルーチンステートメント
[begin_label:] 開始
  [ステートメントリスト]
    …
終了 [end_label]

#データベースを作成し、例の操作のためにデータテーブルをバックアップします

mysql> データベース db1 を作成します。
mysql> db1 を使用します。    
mysql> select * from TENNIS.PLAYERS として PLAYERS テーブルを作成します。
mysql> select * from TENNIS.MATCHES としてテーブル MATCHES を作成します。

例: 特定のプレイヤーがプレイしたすべてのゲームを削除するストアドプロシージャを作成する

mysql> delimiter $$ #ステートメントの終了記号をセミコロン;から2つの$$に一時的に変更します(カスタマイズ可能)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
    -> 開始
    -> 一致から削除
    -> ここで、playerno = p_playerno;
    -> 終了$$
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> delimiter ; #文の終了記号をセミコロンに戻す

分析:

デフォルトでは、ストアド プロシージャはデフォルトのデータベースに関連付けられます。特定のデータベースにストアド プロシージャを作成するように指定する場合は、プロシージャ名の前にデータベース名を付けます。

プロシージャを定義するときは、DELIMITER $$ コマンドを使用して、ステートメント終了記号をセミコロン 1 個から 2 つの $$ に一時的に変更し、プロシージャ本体で使用されるセミコロンがクライアント (MySQL など) によって解釈されることなくサーバーに直接渡されるようにします。

2. ストアド プロシージャを呼び出します: call sp_name[(pass param)];

mysql> MATCHES から * を選択します。
+---------+---------+---------+-----+------+
| 試合番号 | チーム番号 | 選手番号 | 勝利 | 敗北 |
+---------+---------+---------+-----+------+
| 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 です (0.00 秒)
mysql> delete_matches(57) を呼び出します。
クエリは正常、1 行が影響を受けました (0.03 秒)
mysql> MATCHES から * を選択します。
+---------+---------+---------+-----+------+
| 試合番号 | チーム番号 | 選手番号 | 勝利 | 敗北 |
+---------+---------+---------+-----+------+
| 1 | 1 | 6 | 3 | 1 |
| 8 | 1 | 8 | 0 | 3 |
| 9 | 2 | 27 | 3 | 2 |
| 11 | 2 | 112 | 2 | 3 |
+---------+---------+---------+-----+------+
セット内の 4 行 (0.00 秒)

分析:

パラメータとして渡す必要がある変数 p_playerno は、ストアド プロシージャ内で設定されます。ストアド プロシージャが呼び出されると、パラメータ渡しによって p_playerno に 57 が割り当てられ、ストアド プロシージャ内で SQL 操作が実行されます。

3. ストアドプロシージャ本体

  • ストアド プロシージャ本体には、DML および DDL ステートメント、if-then-else および while-do ステートメント、変数を宣言するための宣言ステートメントなど、プロシージャが呼び出されたときに実行する必要があるステートメントが含まれます。
  • 手順本体の形式: begin で始まり、end で終わります (ネスト可能)
始める
  始める
    始める
      声明; 
    終わり
  終わり
終わり

: ネストされた各ブロックとその中の各ステートメントは、セミコロンで終了する必要があります。プロシージャ本体の終了を示す begin-end ブロック (複合ステートメントとも呼ばれます) には、セミコロンは必要ありません。

4. ステートメントブロックにラベルを付ける

[begin_label:] 開始
  [ステートメントリスト]
終了 [end_label]

例えば:

ラベル1: 開始
  ラベル2: 開始
    ラベル3: 開始
      声明; 
    ENDラベル3;
  ENDラベル2;
終了ラベル1

タグには 2 つの機能があります。

  • コードの可読性を向上させる
  • 一部のステートメント (たとえば、leave ステートメントや iterate ステートメント) では、ラベルが必要です。

2. ストアドプロシージャのパラメータ

ストアド プロシージャには、ストアド プロシージャの定義で使用される 0 個以上のパラメーターを設定できます。

3 つのパラメータ タイプ:

  • IN 入力パラメータ: 呼び出し元がプロシージャに値を渡すことを示します (渡される値はリテラルまたは変数です)
  • OUT 出力パラメータ: プロシージャが呼び出し元に値を渡すことを示します (複数の値を返すことができます) (出力値は変数のみになります)
  • INOUT 入力および出力パラメータ: 呼び出し元がプロシージャに値を渡し、プロシージャが呼び出し元に値を渡すことを示します (値は変数のみになります)

1. 入力パラメータ

mysql> 区切り文字 $$
mysql> プロシージャ in_param(in p_in int) を作成します
    -> 開始
    -> p_in を選択します。
    ->p_in=2 を設定します。
    -> P_in を選択します。
    -> 終了$$
mysql> 区切り文字;
mysql> @p_in=1 を設定します。
mysql> in_param(@p_in); を呼び出します。
+------+
| p_in |
+------+
| 1 |
+------+
+------+
| ピン |
+------+
| 2 |
+------+
mysql> @p_in を選択します。
+-------+
| @p_in |
+-------+
| 1 |
+-------+

#上記から、ストアド プロシージャで p_in が変更されていることがわかりますが、前者はローカル変数であり、後者はグローバル変数であるため、@p_id の値には影響しません。

2. 出力パラメータ

mysql> 区切り文字 //
mysql> プロシージャ out_param(out p_out int) を作成します
    -> 開始
    -> p_out を選択します。
    ->p_out=2 を設定します。
    -> p_out を選択します。
    -> 終了
    -> //
mysql> 区切り文字;
mysql> @p_out=1 を設定します。
mysql> out_param(@p_out); を呼び出します。
+-------+
| p_out |
+-------+
| NULL |
+-------+
  #outは呼び出し元にパラメータを出力するもので、入力パラメータを受け取らないため、ストアドプロシージャのp_outはnullになります
+-------+
| p_out |
+-------+
| 2 |
+-------+
mysql> @p_out を選択します。
+--------+
| @p_out |
+--------+
| 2 |
+--------+
  #out_paramストアドプロシージャを呼び出し、パラメータを出力し、p_out変数の値を変更します

3. inout入力パラメータ

mysql> 区切り文字 $$
mysql> プロシージャ inout_param(inout p_inout int) を作成します
    -> 開始
    -> p_inout を選択します。
    ->p_inoutを2に設定します。
    -> p_inout を選択します。
    -> 終了
    -> $$
mysql> 区切り文字;
mysql> @p_inout を 1 に設定します。
mysql> inout_param(@p_inout); を呼び出します。
+---------+
| p_inout |
+---------+
| 1 |
+---------+
+---------+
| p_inout |
+---------+
| 2 |
+---------+
mysql> @p_inout を選択します。
+----------+
| @p_inout |
+----------+
| 2 |
+----------+

#inout_paramストアドプロシージャを呼び出し、入力パラメータを受け入れ、またパラメータを出力し、変数を変更します

知らせ:

1 プロシージャにパラメータがない場合は、プロシージャ名の後に括弧も記述する必要があります。

: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) …

2. パラメータ名が列名と同じでないことを確認します。同じでないと、パラメータ名はプロシージャ本体で列名として扱われます。

壁のひび割れの提案:

  • パラメータで使用する入力値。
  • 戻り値は out パラメータを使用します。
  • 入出力パラメータの使用はできる限り少なくしてください。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャの作成、呼び出し、管理の詳細な説明
  • MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法
  • MySQL でのカスタム関数とストアド プロシージャの作成に関する詳細な説明
  • MySQLは動的にテーブルを作成し、テーブルにデータを保存します。
  • MySQL ストアド プロシージャが相互に呼び出してエラー コードを取得する例
  • MySQL ストアド プロシージャの例 (トランザクション、出力パラメータ、ネストされた呼び出しを含む)

<<:  超大型フォントを使用した 40 の Web ページ デザイン

>>:  Docker のコンテナ データ ボリュームの概要

推薦する

HTML+CSSで充電水滴融合特殊効果コードを実現

目次序文:成し遂げる:要約:まず効果を見てみましょう: 序文:このアイデアは、Bilibili のア...

htm 初心者ノート(初心者は必ず読んでください)

1. HTMLとは何かHTML (ハイパーテキスト マークアップ言語): ハイパーテキスト マーク...

HTML ページ共通スタイル (推奨)

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピーbody、di...

Vue3のレスポンシブ原則の詳細な説明

目次Vue2 レスポンシブ原則のレビューVue3 レスポンシブ原則の分析ネストされたオブジェクトの応...

W3C チュートリアル (9): W3C XPath アクティビティ

XPath は、XML ドキュメントの一部を選択するための言語です。 XPath は、XSLT、XQ...

Dockerの匿名マウントと名前付きマウントの具体的な使用法

目次データ量匿名マウントと名前付きマウントデータボリュームの場所データ量匿名マウントと名前付きマウン...

ウェブフォーム送信方法の詳細な概要

まず、フォームを送信するいくつかの方法を見てみましょう。 1. <!--一般的な送信ボタン--...

リンクをクリックしたときに表示される点線のボックスを削除するいくつかの方法

削除する方法はいくつかあります:リンクを直接追加するonfocus="this.blur(...

Linux のような環境で jdk1.8 をインストールし、環境変数を設定する方法の詳細な説明

設定は非常にシンプルですが、毎回確認しないといけないので、記録だけ残しておきます。 1. インストー...

MySQLデータベースインデックスの左端一致原則

目次1. 共同インデックスの説明2. ac はインデックスを使用できますか? 3. 考える4. 最左...

Centos8 に nginx1.9.1 をインストールする詳細な手順

1.17.9 本当はもっと美味しいNginx のダウンロード アドレス: https://nginx...

Linux での scp および sftp コマンドの詳細な説明

目次序文1. SCPの使用法2. sftpを使用する3. scp と sftp の違いは何ですか?ど...

Linux で iostat コマンドを使用するチュートリアル

序文運用・保守を行う人がスキルを持っていなければ、サーバーを操作するのに恥ずかしさを感じてしまうと言...

CSSトランジションは高さを変更することで要素を拡大したり縮小したりします。

一般的な開発ニーズとして、要素の一部を必要になるまで折りたたんでおきたいことが挙げられます。 Boo...

CSS チュートリアル: CSS 属性メディア タイプ

スタイルシートの最も重要な機能の 1 つは、ページ、画面、電子シンセサイザーなどの複数のメディアに適...