MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法

MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法

この記事では、例を使用して、MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法について説明します。ご参考までに、詳細は以下の通りです。

ストアド プロシージャの作成 (CREATE PROCEDURE) と呼び出し (CALL)

ここでは定義や用語については説明しません。例を見てゆっくりと慣れていきましょう。ここで、GetAllProducts() という簡単なストアド プロシージャを作成しましょう。この GetAllProducts() ストアド プロシージャは、主に製品テーブルからすべての製品を選択するために使用されます。 mysql クライアント ツールを起動し、次のコマンドを入力します。

区切り文字 //
 プロシージャ GetAllProducts() を作成する
  始める
  製品から*を選択します。
  終わり //
区切り文字 ;

上記の SQL を詳しく見てみましょう。

  • 最初のコマンドは DELIMITER // ですが、これはストアド プロシージャの構文とは関係ありません。 DELIMITER ステートメントは、標準の区切り文字であるセミコロン (;) を :// に変更します。 この場合、区切り文字はセミコロン (;) から二重スラッシュ // に変更されます。なぜ区切り文字を変更する必要があるのですか? mysql ツールに各ステートメントを 1 つずつ解釈させるのではなく、ストアド プロシージャ全体をサーバーに渡すためです。 END キーワードの後に​​、区切り文字 // を使用してストアド プロシージャの終了を示します。 最後のコマンド (DELIMITER;) は、区切り文字をセミコロン (;) に戻します。
  • 新しいストアド プロシージャを作成するには、CREATE PROCEDURE ステートメントを使用します。 CREATE PROCEDURE ステートメントの後にストアド プロシージャの名前を指定します。この例では、ストアド プロシージャの名前は GetAllProducts であり、ストアド プロシージャの名前の後に括弧が配置されています。
  • BEGIN と END の間の部分は、ストアド プロシージャの本体と呼ばれます。ビジネス ロジックを処理するには、宣言型 SQL ステートメントを本体に配置します。 このストアド プロシージャでは、単純な選択クエリを使用して、製品テーブル内のデータを照会します。

上記の SQL により、ストアド プロシージャが作成されました。完了したら、ストアド プロシージャを呼び出します。呼び出し構文を見てみましょう。

STORED_PROCEDURE_NAME() を呼び出します。

GetAllProducts() ストアド プロシージャを呼び出す特定の SQL を見てみましょう。

GetAllProducts() を呼び出します。

上記の SQL を実行すると、ストアド プロシージャで SQL を実行した結果が表示されます。

変数の作成 (DECLARE) と代入 (SET)

ご存知のとおり、変数は、ストアド プロシージャの実行中に値を変更できる名前付きデータ オブジェクトです。次に、ストアド プロシージャで変数を使用して、直接的/間接的な結果を保存してみます。 これらの変数はストアド プロシージャのローカル変数ですが、変数を使用する前に宣言する必要があることに注意する必要があります。ストアド プロシージャで変数を宣言する場合は、DECLARE ステートメントを使用できます。SQL 構文を見てみましょう。

DECLARE 変数名 データ型(サイズ) DEFAULT デフォルト値;

上記の SQL の意味を見てみましょう。

  • まず、DECLARE キーワードの後に​​変数名を指定します。変数名は、MySQL テーブル列名の命名規則に従う必要があります。
  • 次に、変数のデータ型とサイズを指定します。変数は、INT、VARCHAR、DATETIME などの任意の mysql データ型にすることができます。
  • 最後に、変数が宣言されると、その初期値は NULL になります。ただし、DEFAULT キーワードを使用して変数にデフォルト値を割り当てることができます。

次に、データ型が INT、デフォルト値が 0 の total_sale という変数を宣言します。 SQLを見てみましょう:

total_sale INT DEFAULT 0 を宣言します。

その中でも、MySQL では、単一の DECLARE ステートメントを使用して、同じデータ型を共有する 2 つ以上の変数を宣言できます。SQL を見てみましょう。

x, y INT をデフォルト 0 として宣言します。

上記のSQLでは、2つの整数変数xとyを宣言し、デフォルト値を0に設定しました。変数が設定されたら、値を割り当てます。変数に値を割り当てる場合は、SET ステートメントを使用できます。例を見てみましょう。

total_count INT DEFAULT 0 を宣言します。
合計数を 10 に設定します。

上記の SQL ステートメントでは、total_count 変数に値 10 を割り当てます。 SET ステートメントに加えて、SELECT INTO ステートメントを使用してクエリの結果を変数に割り当てることもできます。例を見てみましょう。

total_products INT DEFAULT 0 を宣言する
 
COUNT(*) を total_products に選択します
製品から

上記の SQL では、次のことを理解する必要があります。

  • まず、total_products という変数を宣言し、その値を 0 に初期化します。
  • 次に、SELECT INTO ステートメントを使用して、データベースの products テーブルから製品の数を選択し、total_products 変数に値を割り当てます。

変数には独自のスコープがあり、それを使用して変数のライフサイクルを定義することがわかっています。 ただし、ストアド プロシージャ内で変数を宣言すると、ストアド プロシージャの END ステートメントに到達したときに変数はスコープ外となり、他のコード ブロックではアクセスできなくなります。

BEGIN END ブロック内で変数を宣言すると、END に到達するとスコープ外になることがわかります。 変数は自身のスコープ内でのみ有効であるため、異なるスコープ内で同じ名前を持つ 2 つ以上の変数を宣言することもできます。 ただし、異なるスコープ内で同じ名前の変数を宣言することは、適切なプログラミング方法ではありません。このうち、@ 記号で始まる変数はセッション変数であり、セッションが終了するまで使用可能でアクセス可能です。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL で 2 つの日付間の連続ログイン日数の最大数を照会する方法
  • MySQL ストアド プロシージャでの変数の定義と割り当て
  • mysqlは連続した日付と変数の割り当てを生成します

<<:  Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

>>:  jsはショッピングカートの加算と減算、価格計算を実装します

推薦する

Dockerリポジトリの一般的なコマンドの詳細な説明

ログイン dockerログインdocker login コマンドを実行し、ユーザー名、パスワード、メ...

Windows 10 で MySQL をダウンロードするための詳細なチュートリアル

MySQL のバージョンは、Enterprise Edition と Community Editi...

ブラウザがクロージャをどのように認識するかについて詳しく説明します

目次序文クロージャの紹介メモリのゴミを識別する方法クロージャのメモリ表現結論序文クロージャは、Jav...

HTMLの行間設定方法と問題点

<p></p> の行間隔を設定するには、style="line-h...

Jenkins を通じて None のイメージを定期的にクリーンアップする方法

序文継続的なコード配信のプロセスで、Jenkins を利用して Docker イメージを作成すると、...

Tencent Cloud Server Centosにデータディスクをマウントする方法

まず、ハードディスクデバイスにデータディスクがあるかどうかを確認します # まずfdisk -lを実...

CentOS 8 システム FTP サーバーのインストールとパッシブ モードの設定の詳細なチュートリアル

目次1. 基本を理解する2. システム環境を確認する3. ftpコマンドをインストールする[オプショ...

Linuxシステムの操作レベルの詳細な紹介

目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...

MySQL のユーザー権限を照会する方法の概要

MySQLユーザー権限を表示する2つの方法を紹介します1. MySQL grantsコマンドを使用す...

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策

Vue ルーティング this.route.push ジャンプ ページが更新されない1. 背景概要:...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...

ウェブページのドロップダウンリストとdivレイヤーのカバーの問題を選択する

HTML の select 要素に関する質問は、さまざまな場所で提起されています。最近のプロジェクト...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

Reactの3つの主要属性におけるpropsの使用の詳細な説明

目次クラスコンポーネント機能コンポーネントプロパティは読み取り専用ですコンポーネント間通信前回は状態...