我正在使用云 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
不会引发错误。
提前致谢
最佳答案
您的第一个存储过程接受整数参数。问题在于,对存储过程的调用会在存储过程生效之前进行“转换”。想必在存储过程之外sql模式并不严格。因此,当 SQL 模式生效时,参数看起来有效。
这里有两个选项:
更改参数以保存更大的值,例如
BIGINT
和VARCHAR(255)
。那么转换应该会导致失败。更改代码以在调用过程之前设置严格模式。
关于mysql - mysql存储过程中超出范围的溢出处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503608/