この記事では、例を使用して、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 ステートメントを単独で使用する場合、すべての属性は条件ハンドラーに渡される属性と同じになります。呼び出し元に送信される前にエラー メッセージを変更するストアド プロシージャを見てみましょう。 区切り文字 $$ 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データベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)
序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...
以下のインストールではすべて、インストール ルート ディレクトリとして ~/ ディレクトリが使用され...
レンガを移動するプロセスでは、さまざまな環境および構成の問題があり、毎回異なるエラーが発生します。 ...
目次初期化初期化状態()初期化プロパティ()初期化データ()観察する()オブザーバーリアクティブを定...
目次序文スタイル機能説明初期化コードイベントリスナーの追加リスナーツールバーモニターテーブル行ツール...
序文この記事では主にMySQLのメモリ使用量に関する関連コンテンツを紹介し、皆さんの参考と学習のため...
序文: Linux システムでの rm は元に戻せません。コマンドの設計自体に問題はありません。問題...
目次まとめ基本的な例モチベーションデザインの詳細コンパイルの詳細採用戦略練習するヒント適切なプロパテ...
mysql countの詳細な説明count関数はテーブルや配列内のレコードを数えるために使われます...
目次物体オブジェクト定義オブジェクトのメンバーを反復処理するJS組み込みオブジェクト数学オブジェクト...
CPU 権限の制限により、Linux ユーザー状態とカーネル状態間の通信は、プロセス間通信を使用した...
目次問題の説明解決問題分析問題の説明MySQL で delete ステートメントを使用してデータを削...
1. MySQL インストール パス D:\xxx\MYSQL\MySQL Workbench CE...
ターミナルやコンソールで作業しているときは、メールを読むなど、もっと重要な作業があるかもしれないので...
目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...