我的问题说明了一切。我有mysql存储的函数,返回类型为十进制12,2。
这是整个代码:
BEGIN
-- The only edit is ony line number 9, 32 and 33
DECLARE ctrNumber VARCHAR(50);
DECLARE finNumber VARCHAR(50) DEFAULT '';
DECLARE sChar VARCHAR(1); -- be aware varchar length is 1
DECLARE inti INTEGER DEFAULT 1;
SET @in_string = '.abc12';
IF LENGTH(@in_string) > 0 THEN
-- Loops from . to 1 (.abc1)
WHILE(inti <= LENGTH(@in_string)) DO
SET sChar = SUBSTRING(@in_string, inti, 1);
-- Find if it contains the following array
SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9,.');
-- If returns true or 1 or 2 or positive number it means it contains
IF ctrNumber > 0 THEN
SET finNumber = CONCAT(finNumber, sChar);
END IF;
SET inti = inti + 1;
END WHILE;
-- end of loop from . to 1
RETURN CAST(finNumber AS DECIMAL(12,2)) AS final;
ELSE
RETURN 0;
END IF;
END
该错误发生在以下部分:
RETURN CAST(finNumber AS DECIMAL(12,2)) AS final;
finNumber是".12"
,我将其从字符串转换为十进制。
当我在存储过程中尝试使用SELECT CAST(finNumber AS DECIMAL(12,2)) AS final;
时,它工作正常。
您可以使用十进制数12,2的返回类型复制我的整个代码,并将其粘贴到存储的函数/过程中。
我已经在MySQL和MariaDB中都尝试过了,但事实并非如此。
这是错误:
以下查询失败:“ CREATE FUNCTION
ExtractNumber
() 返回DECIMAL(10,2)不确定SQL否安全定义 开始-唯一的编辑是第9、32和33行的DECLARE ctrNumber VARCHAR(50); DECLARE finNumber VARCHAR(50)默认值''; 声明sChar VARCHAR(1); -注意varchar的长度为1 DECLARE inti 整数默认值1; SET @in_string ='.abc12';如果长度(@in_string)> 0 THEN-从循环。到1(.abc1)WHILE(inti <= LENGTH(@in_string)) 设置sChar = SUBSTRING(@in_string,inti,1); -查找是否包含 以下数组SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9 ,.'); -如果返回true或1或2或正 数字表示它包含IF ctrNumber> 0 THEN SET finNumber = CONCAT(finNumber,sChar);万一; SET inti = inti + 1;结束时; - 从结束的循环。到1-原始代码:删除CAST和UNSIGNED- UNSIGNED会删除所有特殊字符或字母-因为CAST会进行转换 数字转换为INT或UNSIGNED-返回CAST(finNumber AS UNSIGNED)AS 最后;以最终形式返回CAST(finNumber AS DECIMAL(12,2));否则返回 0;万一;结束“MySQL说:#1064-您的SQL语法有误;检查 对应于您的MariaDB服务器版本的手册 在'AS final附近使用的语法;否则返回0;万一; END',位于第33行