mysql存储过程中的超出范围溢出处理

时间:2014-08-26 10:30:48

标签: mysql stored-procedures google-cloud-sql

我正在使用云端SQL。我想使用存储过程来处理超出范围的溢出。

所以,我用了

SET sql_mode='STRICT_ALL_TABLES';

使用int,decimal和varchar

创建样本表
CREATE TABLE t4 (ii INT, dd DECIMAL(5,2), ff VARCHAR(5));

程序1:

DROP PROCEDURE IF EXISTS SAMPLE_SQL_MODE1;
CREATE PROCEDURE `SAMPLE_SQL_MODE1`(ii INT,dd DECIMAL(5,2),ff varchar(5))
BEGIN
    SET sql_mode='STRICT_ALL_TABLES';

    INSERT INTO t4 VALUES (ii, dd, ff);

    SELECT * FROM t4;
    SELECT @@sql_mode;
END;

call SAMPLE_SQL_MODE1(12344444444,12344.33,'Nummber FIVE');

程序1结果:

 select * from t4;  

 max of int , decimal(5,2) inserted.

--------   --------  -------
 ii            dd       ff
--------   --------   -------
 2147483647 999.99    Nummb
----------  -------  -------

程序2:

DROP PROCEDURE IF EXISTS SAMPLE_SQL_MODE2;
CREATE PROCEDURE `SAMPLE_SQL_MODE2`()
BEGIN
    SET sql_mode='STRICT_ALL_TABLES';

    INSERT INTO t4 (ii, dd, ff) 
    VALUES (12344444444, 12344.33, 'Nummber FIVE');

    SELECT * FROM t4;
    SELECT @@sql_mode;
END;

call SAMPLE_SQL_MODE2();

程序2结果:

Out of range value for column 'ii' at row 1

请帮帮我。如何在存储过程中使用set sql mode = ='STRICT_ALL_TABLES'?

我正在使用Procedure 1之类的所有程序,但sql_mode不会引发错误。

提前致谢

1 个答案:

答案 0 :(得分:0)

您的第一个存储过程正在接受整数的参数。问题是存储过程的调用在存储过程生效之前执行“转换”。据推测,sql模式在存储过程之外并不严格。因此,当SQL模式生效时,参数看起来有效。

以下是两个选项:

  1. 更改参数以保存更大的值,例如BIGINTVARCHAR(255)。然后转换应该导致失败。

  2. 调用程序之前,将代码更改为设置严格模式