全部產品
Search
文件中心

ApsaraDB RDS:SQL在Procedure內執行報錯

更新時間:Oct 29, 2024

問題現象

一個直接執行可以成功(可能會報Warning)的SQL語句,在Procedure內部執行失敗並報錯。

例如:

一個UPDATE語句嘗試將一個date屬性的列值更新為空白字串:

UPDATE t1 SET start_date="" where id=2;

直接執行該語句成功並報Warning:

+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1265 | Data truncated for column 'start_date' at row 2 |
+---------+------+--------------------------------------------------------+

在Procedure內部執行該語句失敗並報錯:

ERROR 1292 (22007): Incorrect date value: '' for column 'start_date' at row 2

可能原因

建立Procedure時,MySQL會記錄當時的變數sql_mode的值,並儲存在系統資料表mysql.proc中。Procedure運行時使用建立時的sql_mode值而非運行時的sql_mode值,如果建立時的sql_mode值比運行時的sql_mode值限制條件更多,就會出現上述問題。

在上述案例中,建立Procedure時的sql_mode值為'STRICT_TRANS_TABLES',而運行時的sql_mode值為'''STRICT_TRANS_TABLES'的限制條件比''更多,所以出現上述問題。

解決方案

可以選擇以下兩種解決方案:

  • 按照實際需求,重新設定sql_mode的值,然後重新建立Procedure。

  • 按照實際需求,修改已有的Procedure在mysql.proc裡的sql_mode的值。

    UPDATE mysql.proc SET sql_mode='xxx' WHERE Procedure='xxx';