MySQLカスタム関数とストアドプロシージャの詳細な説明

MySQLカスタム関数とストアドプロシージャの詳細な説明

序文

この記事では主にMySQLのカスタム関数とストアドプロシージャに関する関連コンテンツを紹介し、皆さんの参考と学習のために共有します。詳しい紹介を見てみましょう。

1. 前提条件

MySQL データベースには user_info テーブルがあり、その構造とデータは次のとおりです。

mysql> desc user_info;
+-----------+----------+------+------+-------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-----------+----------+------+------+-------+-------+
| id | int(10) | NO | PRI | NULL | |
| 名前 | char(20) | NO | | NULL | |
| パスワード | char(40) | NO | | NULL | |
| 電子メール | char(20) | NO | | NULL | |
| 電話 | char(20) | NO | | NULL | |
| 役割 | char(10) | NO | | NULL | |
| 性別 | char(10) | NO | | NULL | |
| ステータス | int(10) | NO | | NULL | |
| createAt | 日時 | NO | | NULL | |
| exprAt | 日時 | NO | | NULL | |
| 有効日数 | int(10) | NO | | NULL | |
| delAt | 日時 | YES | | NULL | |
+-----------+----------+------+------+-------+-------+
12 行セット (0.10 秒)

mysql> user_info から * を選択します。
+----+--------------+-----------+-------------+------------+----------+---------+----------------------+----------------------+--------+-------+
| id | 名前 | パスワード | 電子メール | 電話 | 役割 | 性別 | ステータス | 作成日時 | 有効期限 | 有効期限 |
+----+--------------+-----------+-------------+------------+----------+---------+----------------------+----------------------+--------+-------+
| 1 | StephenWang7 | py123456 | [email protected] | 15103887470 | 管理者 | 男性 | 200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 | 30 | NULL |
| 2 | StephenWang8 | 123456 | [email protected] | 15103887470 | 視聴者 | 男性 | 200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 | 30 | NULL |
+----+--------------+-----------+-------------+------------+----------+---------+----------------------+----------------------+--------+-------+
セット内の 2 行 (0.00 秒)

2. カスタム関数

関数: 特定の機能を実行できる SQL ステートメントのセット。 MySQL は、特定のビジネス機能を完了するためのカスタム関数をサポートしています。

ユーザー定義関数 (UDF) を作成するための構文は次のとおりです。

関数 <関数名> を作成します ([パラメータ 1] [タイプ 1]、[パラメータ N] [タイプ N])
<type> を返します
戻る
<関数本体>

UDF を呼び出すための構文は次のとおりです。

select <関数名> ([パラメータ])

パラメータなしのUDFの作成

例1: user_infoテーブル内のレコード数を照会する

#関数の定義 mysql> create function user_info_count()
 -> int(10) を返します
 -> 戻る
 -> (user_info から count(*) を選択);

user_info_count()関数を呼び出す

mysql> user_info_count() を選択します。
+-------------------+
| ユーザー情報カウント() |
+-------------------+
| 2 |
+-------------------+
セット内の 1 行 (0.00 秒)

パラメータ付きUDFの作成

例 2: ID に基づいてユーザー名を照会します。

#関数の定義 mysql> create function queryNameById(uid int(10))
 -> char(20) を返します
 -> 戻る
 -> (id=uid の場合、user_info から名前を選択);
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

ID 1 のユーザー名を照会する関数を呼び出します。

mysql> queryNameById(1) を選択します。
+------------------+
| クエリ名ID(1) |
+------------------+
翻訳:
+------------------+
セット内の 1 行 (0.00 秒)

UDFを表示

システム内のすべてのUDFをクエリする

関数のステータスを表示します。

指定されたUDFをクエリする

#
作成関数を表示する関数名;
mysql> 関数 queryNameById を表示します。
エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の 'queryNameById' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
mysql> 関数 queryNameById() を表示します。
エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の 'queryNameById()' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
mysql> 作成関数 queryNameById() を表示します。
エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の '()' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
mysql> show create function queryNameById;
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------+
| 関数 | sql_mode | 関数の作成 | character_set_client | collat​​ion_connection | データベース照合 |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------+
| queryNameById | ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `queryNameById`(uid int(10)) RETURNS char(20) CHARSET latin1
戻り値 (id=uid の場合、user_info から名前を選択) | utf8 | utf8_general_ci | latin1_swedish_ci |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------+
セット内の1行(0.00秒)

UDFの変更

関数の内容を変更する場合は、関数を削除してから再作成してください。

UDF の削除

UDF を削除するための構文は次のとおりです。

関数 <関数名> を削除します。

例 3: queryNameId 関数を削除し、再度呼び出して現象を観察します。

mysql> 関数 queryNameById を削除します。
クエリは正常、影響を受けた行は 0 行 (0.45 秒)

mysql> queryNameById(1) を選択します。
エラー 1305 (42000): FUNCTION rms.queryNameById が存在しません
マイSQL>

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

ストアド関数はカスタム関数に似ており、特定の機能を実行する SQL ステートメントのセットでもあります。複雑なSQLや頻繁に呼び出されるSQLを事前に記述し、名前を付けます。使いたいときに呼び出すだけ。

ストアド プロシージャを定義するための構文は次のとおりです。

CREATE PROCEDURE <プロシージャ名> ( [プロシージャパラメータ[,…] ] ) <プロシージャ本体>
[プロシージャパラメータ[,…]] 形式
[ IN | OUT | INOUT ] <パラメータ名> <タイプ>
#構文定義: http://c.biancheng.net/view/2593.html

パラメータなしのストアドプロシージャの作成

例 4: ユーザー名を照会します。

mysql> 区切り文字 //
mysql> プロシージャ queryName() を作成します
 -> 開始
 -> user_info から名前を選択します。
 -> 終了 //

DELIMITER コマンドに関しては、MySQL コマンドを終了する文字を変更します。デフォルトの終了コマンド文字はセミコロンです。ストアド プロシージャに複数のステートメントが含まれている場合、最初のセミコロンはストアド プロシージャの終了の記号として使用されます。これは予想どおりではないため、デフォルトのコマンド終了文字を変更する必要があります。 DELIMITER // は終了コマンド文字を // に変更します。ストアド プロシージャを呼び出すコマンドは、call stored procedure name です。

#この時点でのコマンドの終了記号は // ではありません;
mysql> queryName() を呼び出す //
+--------------+
| 名前 |
+--------------+
翻訳:
翻訳:
+--------------+
セット内の 2 行 (0.00 秒)

クエリは正常、影響を受けた行は 0 行 (0.00 秒)

パラメータ付きのストアドプロシージャの作成

例 5: ID に基づいて名前をクエリします。

mysql> プロシージャ queryNameById を作成する
 -> (uid int(15)内)
 -> 開始
 -> user_info から id=uid となる名前を選択します。
 -> 終了
 -> //
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

ストアドプロシージャqueryNameByIdを呼び出す

mysql> queryNameById(1); を呼び出します。
 -> //
+--------------+
| 名前 |
+--------------+
翻訳:
+--------------+
セット内の1行(0.03秒)

クエリは正常、影響を受けた行は 0 行 (0.04 秒)

ストアドプロシージャを変更する

ストアド プロシージャの内容を作成する場合は、ストアド プロシージャを削除してから再作成することができます。

ストアドプロシージャを表示する

show create procedure <プロシージャ名>
mysql> show create procedure queryNameById; -> // +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | Procedure | sql_mode | Create Procedure | character_set_client | collat​​ion_connection | Database Collat​​ion | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | queryNameById | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `queryNameById`(In uid int(15)) begin select name from user_info where id=uid; end | utf8 | utf8_general_ci | latin1_swedish_ci | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 1 row in set (0.04 sec)

ストアドプロシージャの削除

プロシージャ <プロシージャ名> を削除します

ストアドプロシージャqueryNameByIdを削除します

mysql> プロシージャ queryNameById を削除します //
クエリは正常、影響を受けた行は 0 行 (0.02 秒)


mysql> queryNameById(1) を呼び出す //
エラー 1305 (42000): PROCEDURE rms.queryNameById が存在しません

4. まとめ

カスタム関数とストアド プロシージャはどちらも特定の機能を実行する SQL セットですが、それらの違いは何でしょうか。

a. 異なる呼び出し方法

#カスタム関数
<関数名> を選択
#ストアドプロシージャ
<ストアド プロシージャ名> を呼び出す

b. カスタム関数には出力パラメータを設定できませんが、ストアド プロシージャには設定できます。

c. カスタム関数には return ステートメントが含まれている必要がありますが、ストアド プロシージャには必要ありません。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQLシリーズ5つのビュー、ストアド関数、ストアドプロシージャ、トリガー
  • MySQL ストアド プロシージャと共通関数のコード分析
  • MySQL ストアドプロシージャとストアドファンクションの詳細な説明
  • MySQL でのストアド プロシージャと関数の作成の詳細な説明

<<:  vue.jsは画像のURLに従って画像をダウンロードします

>>:  Centos8 で yum を使用して rabbitmq をインストールするチュートリアル

推薦する

HTML テーブル マークアップ チュートリアル (5): ライト ボーダー カラー属性 BORDERCOLORLIGHT

表では、左上の境界線の色を個別に定義したり、セルの右下の境界線の色を定義したりできます。これら 2 ...

MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します

デフォルトでは、MySQL は日付に 0 値を挿入することを受け入れますが、実際には日付の 0 値に...

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

Vue要素のバックグラウンド認証プロセスの分析

序文:最近、プロジェクトで管理システムに遭遇しました。権限設定が非常に興味深いと思いました。自分の学...

MySQLインストーラがコミュニティモードで実行されている場合の解決策

今日、リモートデスクトップを実行してログインしているときにこのプロンプトを見つけました「MySQL ...

HTML 編集の基礎 (初心者必読)

DREAMWEAVER を開き、新しい HTML を作成します。 。ボディの特性: bgcolor...

モバイル適応型ウェブページ効果は、小さな表示ページの問題を解決します

仕事上、携帯電話に適応した Web ページ効果を作成する必要があります。ようやく完成しました。まずは...

docker-compose で Jenkins をインストールする際の実践的なメモ

ディレクトリを作成する cd /usr/local/docker/ jenkins-docker を...

MySQL クエリの重複データ (重複データを削除し、ID が最も小さいデータのみを保持します)

開発の背景:最近、私はバッチ データを MySQL データベースにインポートする機能に取り組んでいま...

VMware Tools を最初からインストールするための詳細な手順 (グラフィック チュートリアル)

VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...

MYSQL メタデータ ロック (MDL ロック) の理論とロック タイプ テスト

目次MYSQL メタデータ ロック (MDL ロック) 学習理論とロック タイプ テスト1. 予備的...

MySQL ストアド プロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考ま...

MySQL スロークエリ関連パラメータの原理の分析

MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...

CSSに基づいてマウス入力の方向を決定する

以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っ...