ストアド プロシージャでエラー状態をトリガーする mysql ストアド プロシージャの分析例 (SIGNAL および RESIGNAL ステートメント)

ストアド プロシージャでエラー状態をトリガーする mysql ストアド プロシージャの分析例 (SIGNAL および RESIGNAL ステートメント)

この記事では、例を使用して、MySQL がストアド プロシージャで引き起こすエラー状態 (SIGNAL および RESIGNAL ステートメント) を説明します。ご参考までに、詳細は以下の通りです。

mysql では、SIGNAL および RESIGNAL ステートメントを使用して、ストアド プロシージャでエラー状態を発生させることができます。

まずSIGNALステートメントを見てみましょう。通常、SIGNAL ステートメントは、ストアド プロシージャ、ストアド関数、トリガー、イベントなどのストアド プログラムで呼び出し元にエラーまたは警告状態を返すために使用します。 SIGNAL ステートメントは、返される情報 (値やメッセージ SQLSTATE など) を制御します。文法構造を見てみましょう:

SIGNAL SQLSTATE | 条件名;
SET 条件情報項目名1 = 値1、
  condition_information_item_name_1 = value_2 など;

SIGNAL キーワードは、DECLARE CONDITION ステートメントによって宣言された SQLSTATE 値または条件名です。ただし、SIGNAL ステートメントでは、常に SQLSTATE 値または SQLSTATE 値を使用して定義された名前付き条件を指定する必要があることに注意してください。呼び出し元に情報を提供する場合は、SET 句を使用する必要があります。値を使用して複数の条件情報項目名を返す場合は、それぞれの名前と値のペアをコンマで区切る必要があります。上記の SQL では、condition_information_item_name には MESSAGE_TEXT、MYSQL_ERRORNO、CURSOR_NAME などを指定できます。既存の販売注文に注文明細項目を追加し、注文番号が存在しない場合はエラー メッセージを発行するストアド プロシージャを見てみましょう。

区切り文字 $$
CREATE PROCEDURE AddOrderItem(in orderNo int,
 productCode varchar(45)では、
 数量はint、価格はdouble、行番号はint)
始める
 C INT を宣言します。
 COUNT(注文番号)をCに入力する
 注文から 
 ここで、orderNumber = orderNo;
 -- orderNumber が存在するかどうかを確認します
 IF(C != 1) ならば 
 シグナルSQLSTATE '45000'
 SET MESSAGE_TEXT = '注文テーブルに注文番号が見つかりません';
 終了の場合;
 -- 下記にさらにコードがあります
 -- ...
終了 $$
区切り文字 ;

最初に、ストアド プロシージャに渡された入力注文番号を使用して注文をカウントし、注文数が 1 でない場合は、注文番号が orders テーブルに存在しないというエラー メッセージとともに SQLSTATE 45000 エラーが発生します。ここで、45000 は、未処理のユーザー定義例外を示すために使用される一般的な SQLSTATE 値です。

ストアド プロシージャ AddOrderItem() を呼び出しますが、存在しない注文番号を渡すと、エラー メッセージが表示されます。

AddOrderItem(10,'S10_1678',1,95.7,1)を呼び出します。

上記のコードを実行すると、次の結果が得られます。

mysql> AddOrderItem を呼び出します (10,'S10_1678',1,95.7,1);
1644 - 注文表に注文番号が見つかりません
マイSQL>

RESIGNAL ステートメントをもう一度見てみましょう。機能と構文は SIGNAL ステートメントに似ていますが、次の違いがあります。

  • エラー ハンドラーまたは警告ハンドラーでは RESIGNAL ステートメントを使用する必要があります。そうしないと、「ハンドラーがアクティブでないときに RESIGNAL を実行してください」というエラー メッセージが表示されます。 SIGNAL ステートメントはストアド プロシージャ内のどこでも使用できることに注意してください。
  • RESIGNAL ステートメントのすべての属性は、SQLSTATE 値も含めて省略できます。

RESIGNAL ステートメントを単独で使用する場合、すべての属性は条件ハンドラーに渡される属性と同じになります。呼び出し元に送信される前にエラー メッセージを変更するストアド プロシージャを見てみましょう。

区切り文字 $$
CREATE PROCEDURE Divide(IN 分子 INT、IN 分母 INT、OUT 結果 double)
始める
 SQLSTATE '22012' の division_by_zero 条件を宣言します。
 division_by_zero の継続ハンドラを宣言する 
 RESIGNAL SET MESSAGE_TEXT = 'ゼロ除算 / 分母はゼロにできません';
 -- 
 分母が0の場合
 シグナルdividion_by_zero;
 それ以外
 SET 結果 := 分子 / 分母;
 終了の場合;
終了 $$
区切り文字 ;

次に、次のように呼び出してみましょう。

mysql> 呼び出し Divide(10,0,@result);
1644 - ゼロ除算 / 分母はゼロにできません

さて、この記録はここで終わります。これで何か得られたものはあったでしょうか。

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

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

以下もご興味があるかもしれません:
  • MySQL の if 文と case 文の概要
  • MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明
  • 複数の値を返す MySQL ストアド プロシージャ メソッドの例
  • MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法
  • MySQL ストアド プロシージャのエラー処理例の詳細な説明
  • MySQL ストアド プロシージャの原理と使用法の詳細な説明
  • MySQL ストアド プロシージャでの変数の定義と割り当て
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySQL ストアド プロシージャの例 (トランザクション、出力パラメータ、ネストされた呼び出しを含む)
  • MySql ストアド プロシージャと関数の詳細な説明
  • MySQL ストアド プロシージャで if ステートメントを使用する詳細な例

<<:  SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)

>>:  ES6のシンボルデータ型について詳しく説明します

推薦する

Dockerにelasticsearchとkibanaをインストールする方法

Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...

CSSのtranslate(-50%,-50%)は水平および垂直の中央揃え効果を実現します。

translate(-50%,-50%) 属性:中央に配置するには、長さと幅の 50% だけ上と左...

Ubuntu16.04はphp5.6ウェブサーバー環境を構築します

Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...

Mongodb の GUID 表示の問題の詳細な分析

問題を見つける最近、プログラムのストレージを Mongodb に移行したところ、Guid 型が書き込...

Vue が scss (mixin) をグローバルに導入

目次1. ミックスイン.scss 2. 単一ファイルの使用3. グローバルマウント3.1 依存関係の...

MySQL における IF()、IFNULL()、NULLIF()、および ISNULL() 関数の使用に関する詳細な説明

MySQL では、IF()、IFNULL()、NULLIF()、および ISNULL() 関数を使用...

Linux で一般的なソフトウェアを設定する方法

新しいLinuxサーバーを入手する場合、通常は次の5つの構成を実行する必要があります。 HOSTAN...

判定条件を使用してCSSファイルをインポートする

解決策 1: HEAD に次のコードを挿入するなど、HTML ドキュメントで条件付きインポートを使用...

JavaScript はチェックボックスの選択機能を実装します

この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...

Vue で動的パラメータと計算プロパティを使用する方法

1. 動的パラメータ2.6.0 以降では、角括弧で囲まれた JavaScript 式をディレクティブ...

Linux での一般的なシェル スクリプト コマンドと関連知識

目次1. 覚えておくべき知識1. 変数タイプ2. シェル変数の説明3. シングルクォート、ダブルクォ...

mysql mycat ミドルウェアの簡単な紹介

1. mycatとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベ...

ウェブページ制作TDは隠し表示もオーバーフロー可能

おそらく、この記事にこのようなタイトルを付けると、誰かがこう尋ねるでしょう。「なぜまだテーブルに注目...

CentOS 6.2 に MySQL 5.7.28 をインストールするチュートリアル (mysql ノート)

1. 環境整備1.MySQLインストールパス: /usr/local 2. CentOS 6.2 ...

MySQL Binlog ログの読み取り時によくある 3 つのエラー

1. mysqlbinlog: [エラー] 不明な変数 'default-character...