ストアド プロシージャでエラー状態をトリガーする 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のシンボルデータ型について詳しく説明します

推薦する

WeChatアプレットの世界的な状況の詳細な説明

序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...

Docker を使用して ELK ログ システムを構築する例

以下のインストールではすべて、インストール ルート ディレクトリとして ~/ ディレクトリが使用され...

CentOS7でルートパスワードをリセットする方法

レンガを移動するプロセスでは、さまざまな環境および構成の問題があり、毎回異なるエラーが発生します。 ...

レスポンシブ原則のソースコード分析のVue解釈

目次初期化初期化状態()初期化プロパティ()初期化データ()観察する()オブザーバーリアクティブを定...

Layuiテーブル行のデータを動的に編集する

目次序文スタイル機能説明初期化コードイベントリスナーの追加リスナーツールバーモニターテーブル行ツール...

MySQLのメモリ使用量を表示する方法の詳細な説明

序文この記事では主にMySQLのメモリ使用量に関する関連コンテンツを紹介し、皆さんの参考と学習のため...

Linux のごみ箱メカニズムの実装プロセスと使用方法の詳細な説明

序文: Linux システムでの rm は元に戻せません。コマンドの設計自体に問題はありません。問題...

Vue3スタイルのCSS変数注入の実装

目次まとめ基本的な例モチベーションデザインの詳細コンパイルの詳細採用戦略練習するヒント適切なプロパテ...

MySQL countの詳細な説明と関数のサンプルコード

mysql countの詳細な説明count関数はテーブルや配列内のレコードを数えるために使われます...

JavaScript オブジェクトの組み込みオブジェクト、値型、参照型の説明

目次物体オブジェクト定義オブジェクトのメンバーを反復処理するJS組み込みオブジェクト数学オブジェクト...

Linux ユーザー状態とカーネル状態間の通信方法の詳細な説明

CPU 権限の制限により、Linux ユーザー状態とカーネル状態間の通信は、プロセス間通信を使用した...

MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

目次問題の説明解決問題分析問題の説明MySQL で delete ステートメントを使用してデータを削...

Mysql5.7でのスケジュールバックアップの実装

1. MySQL インストール パス D:\xxx\MYSQL\MySQL Workbench CE...

Linux のバックグラウンドで & と nohup を使用する方法

ターミナルやコンソールで作業しているときは、メールを読むなど、もっと重要な作業があるかもしれないので...

RocketMQ の Docker インストールとインストール中に発生した問題の解決策

目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...