この記事では、例を使用して、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 バージョン)
1. 現在インストールされているPHPパッケージを確認するyum list installed |...
新しいプロジェクトは基本的に終了しました。フロントエンドとバックエンドを分離して統合を完了したのは初...
1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...
目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...
1. CSS変数がもたらす質的変化CSS 変数によってもたらされる改善は、CSS コードの節約や C...
日々の開発において、フロントエンドの学生はアニメーションやデザインについてよく議論します。デザイナー...
最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...
背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...
序文Linux システムはシステム サービス crond によって制御されます。 Linux システ...
この記事では、MySQL データベースのバックアップを実装するさまざまな方法について説明します。ご参...
目次行と列の変換トランスクリプトの構成を分析するvue3 + el-table で作成されたトランス...
目次Docker Compose の使用シナリオ基本的なデモ基本的な操作とメンテナンスdocker-...
HTMLでは、中国語のフレーズ「學好好學」は「學好好學」と表現できます。プロジェクトでは、SMSアラ...
背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...
プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...