この記事では、例を使用して、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 バージョン)
Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...
translate(-50%,-50%) 属性:中央に配置するには、長さと幅の 50% だけ上と左...
Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...
問題を見つける最近、プログラムのストレージを Mongodb に移行したところ、Guid 型が書き込...
目次1. ミックスイン.scss 2. 単一ファイルの使用3. グローバルマウント3.1 依存関係の...
MySQL では、IF()、IFNULL()、NULLIF()、および ISNULL() 関数を使用...
新しいLinuxサーバーを入手する場合、通常は次の5つの構成を実行する必要があります。 HOSTAN...
解決策 1: HEAD に次のコードを挿入するなど、HTML ドキュメントで条件付きインポートを使用...
この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...
1. 動的パラメータ2.6.0 以降では、角括弧で囲まれた JavaScript 式をディレクティブ...
目次1. 覚えておくべき知識1. 変数タイプ2. シェル変数の説明3. シングルクォート、ダブルクォ...
1. mycatとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベ...
おそらく、この記事にこのようなタイトルを付けると、誰かがこう尋ねるでしょう。「なぜまだテーブルに注目...
1. 環境整備1.MySQLインストールパス: /usr/local 2. CentOS 6.2 ...
1. mysqlbinlog: [エラー] 不明な変数 'default-character...