SQL错误1366:运行风玫瑰图存储过程报Incorrect DECIMAL value '()'错误
问题定位
- 优先排查
vw_wind_counter视图的底层原始表脏数据:你仅在视图层做了DECIMAL类型转换,若原始表的direccion(风向)、speedy(风速)字段存在()、空字符串等非数值异常值,CAST转换过程中就会触发该报错。旧表无这类脏数据,因此之前的存储过程可以正常运行。 - 其次排查变量初始化问题:检查存储过程开头的
angle变量是否正确设置了初始值(比如初始值设为0),如果angle未初始化导致值为NULL,后续计算angle_grf等值时会生成无效数值,插入临时表时触发类型错误。 - 最后排查隐式类型转换冲突:你的查询条件中存在
direccion > angle1这类数值比对逻辑,如果direccion转换后的DECIMAL精度与angle1变量的精度不匹配,会触发隐式类型转换,脏数据在转换过程中就会抛出该错误。
解决方法
- 定位并处理底层脏数据
执行以下查询找出异常值:
-- 查找风向字段异常值 SELECT DISTINCT direccion FROM 底层原始表 WHERE direccion NOT REGEXP '^[0-9.]+$' OR direccion IS NULL; -- 查找风速字段异常值 SELECT DISTINCT speedy FROM 底层原始表 WHERE speedy NOT REGEXP '^[0-9.]+$' OR speedy IS NULL;
找到异常记录后可以直接清理脏数据,也可以在视图的CAST逻辑中增加容错处理:
-- 视图转换时增加容错,无效值转为0或NULL CAST(CASE WHEN speedy REGEXP '^[0-9.]+$' THEN speedy ELSE 0 END AS DECIMAL(5,2)) AS speedy, CAST(CASE WHEN direccion REGEXP '^[0-9.]+$' THEN direccion ELSE 0 END AS DECIMAL(5,2)) AS direccion
- 统一数值精度,规避隐式转换问题
临时表定义、视图CAST转换、变量声明都统一指定DECIMAL精度,避免精度不匹配触发的转换异常:
-- 临时表字段明确指定精度 CREATE TEMPORARY TABLE viento_count(angulo DECIMAL(5,2), val1 INT, val2 INT, val3 INT, val4 INT, val5 INT, val6 INT);
同时确认存储过程开头已经正确初始化angle变量,比如添加SET angle = 0;。
- 优化插入语句逻辑
将原有INSERT INTO ... SELECT语句改为直接用VALUES插入,避免SELECT无返回值时生成无效数据:
INSERT INTO viento_count(angulo, val1, val2, val3, val4, val5, val6) VALUES (angle_grf, valor1, valor2, valor3, valor4, valor5, valor6);
内容的提问来源于stack exchange,提问作者Eduardo Mancilla
相关产品推荐
相关产品推荐

