有两个问题
1、参数中varchar要定义几个字符,如varchar(20)
2、mysql的注释方式没有//,只有/**/和#
3、存储过程的前后要先定义分隔符DELIMITER
因此最终结果:
DELIMITERCREATE DEFINER=`root`@`%` PROCEDURE `NewProc`(IN `spid` int,IN `spprice` varchar(20),IN `spnum` varchar(20))
BEGIN
DECLARE wareid INT #定义三个变量
DECLARE num1 INT
DECLARE num2 INT
DECLARE cursor_invent CURSOR FOR SELECT goodsid FROM goods /*定义游标 返回参数对应的商品 id*/
OPEN cursor_invent
REPEAT
FETCH cursor_invent INTO wareid #将id赋值给wareid
IF wareid=spid
THEN
SET num1=CONVERT(inventnum,SIGNED) #varchar转化成int
SET num2=CONVERT(spnum,SIGNED)
UPDATE invent SET inventnum=CONCAT(num1+num2) WHERE inventid=spid #如果存在同名商品那么原有数量+现有数量
ELSE INSERT INTO invent(goodsid,inventnum,inventprice) values(spid,spprice,spnum) #不存在就直接插入一条记录
END IF
UNTIL cursor_invent END REPEAT
CLOSE cursor_invent
END
DELIMITER
基本判定为字符集的问题
通过以下代码可以复现:
drop procedure if exists delete_employeesdelimiter $$
-- by sleest, 2019/05/23 此处为复现问题, 特意指定入参字符集为mysql默认字符集latin1
create procedure delete_employees(in xm char(6) CHARSET latin1 COLLATE latin1_bin)
begin
-- begin 测试用
drop temporary table if exists employees
create temporary table employees(`姓名` char(6))
-- end 测试用
delete from employees where 姓名=xm
end $$
call delete_employees('李丽')
在终端或者连接工具中执行会得到一致的错误
call delete_employees('李丽') Error Code: 1366. Incorrect string value: '\xE6\x9D\x8E\xE4\xB8\xBD' for column 'xm' at row 1这里建议在建立完存储过程后, 查下存储过程的字符集:
show create procedure delete_employees主要看结果中的这三列
# character_set_client, collation_connection, Database Collation'utf8', 'utf8_general_ci', 'utf8mb4_general_ci'
本人使用的环境是utf8mb4字符集, 你看看你的会不会是latin1, 如果是的话两种方案
改数据库字符集, 通用些utf8或者支持emjio的utf8mb4, 重启mysql服务再重连试验
建立的每个存储过程手动指定字符集
如:
create procedure delete_employees(in xm char(6) CHARSET utf8 COLLATE utf8_bin) ...这样再试试
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)