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 のコンテナ データ ボリュームの概要

推薦する

Windows 10 に Apache 2.4.41 をインストールするチュートリアル

1. Apache 2.4.41 のインストールと設定最初のステップは、以下に示すように、https...

Vue.jsは音楽プレーヤーを実装します

この記事では、音楽プレーヤーを実装するためのVue.jsの具体的なコードを参考までに共有します。具体...

Linux での Python スクリプトの自動起動とスケジュール起動の詳細な手順

1. Pythonは起動時に自動的に実行されますPython の自己起動スクリプトがauto.pyで...

js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

従来の解決策FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に...

ウェブページのテーブルの境界線を設定する方法

<br />前回は、Web テーブルにセルの線を設定する方法を学びました。今日は、Web...

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

JS は Baidu 検索ボックスを実装します

この記事の例では、Baidu検索ボックスを実装するためのJSの具体的なコードを参考までに共有していま...

Tomcat10 Catalinaのログの文字化けの問題を解決する

実行環境、Idea2020バージョン、Tomcat10、実行時にTomcat CatalinaLog...

Alipay の Java 決済インターフェースを開発するための詳細な手順

目次最初のステップステップ2ステップ3ステップ4 Alipay 決済インターフェースへの接続に関する...

CSSで記事の区切り線のスタイルを実装するさまざまな方法のまとめ

この記事では、CSS で記事の区切り線を実装するさまざまな方法をまとめています。区切り線はページを美...

Linux でローカル コンピューターとリモート サーバーのポートが接続されているかどうかを確認する方法

以下のように表示されます。 1. ssh -v -p [ポート番号] [ユーザー名]@[IPアドレス...

5分でDockerを使ってRedisのクラスターモードとセンチネルモードを構築する方法を教えます

目次1. 準備Redisイメージを取得する2. Redis Sentinel マスタースレーブモード...

MySQL 構成 SSL マスタースレーブ レプリケーション

MySQL5.6 SSLファイルの作成方法公式ドキュメント: https://dev.mysql.c...

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...