問題の説明
プロシージャ内で正常に実行されたSQL文の実行に失敗し、エラーが報告されます。
例:
UPDATEステートメントを実行して、date属性の列の値を空の文字列に変更します。
UPDATE t1 SET start_date="" ここでid=2;
ステートメントが正常に実行され、警告が報告されます。
+ -------- -------- + -------------------------------------------------------- +
| レベル | コード | メッセージ |
+ -------- + ------- + -------------------------------------------------------- +
| 警告 | 1265 | 行2の列 'start_date' のデータが切り捨てられる |
+ -------- + ------- + -------------------------------------------------------- +
プロシージャでのステートメントの実行に失敗し、エラーが報告されます。
エラー1292 (22007): 行2の列 'start_date' の日付値が正しくない: ''
原因
プロシージャを作成すると、MySQLはsql_mode変数の値を記録し、その値をmysql.procシステムテーブルに格納します。 プロシージャの実行中は、実行時の値ではなく、プロシージャの作成時に指定されたsql_mode変数の値を使用します。 前者の値が後者の値よりも多くの制限を有する場合、エラーが報告される。
たとえば、プロシージャの作成時に指定されるsql_mode変数の値は 'STRICT_TRANS_TABLES '
で、ランタイムの値は ''
です。 値 'STRICT_TRANS_TABLES '
には、値 ''
よりも多くの制限があります。 その結果、このエラーが発生します。
ソリューション
次のいずれかの方法を使用して、エラーを解決できます。
ビジネス要件に基づいてsql_mode変数を設定し、プロシージャを再度作成します。
ビジネス要件に基づいて、mysql.procシステムテーブルのプロシージャに対応するsql_mode変数の値を変更します。
UPDATE mysql.proc SET sql_mode='xxx' WHEREプロシージャ='xxx';