第一次写mysql存储过程报错保存不了,求解

第一次写mysql存储过程报错保存不了,求解,第1张

有两个问题

1、参数中varchar要定义几个字符,如varchar(20)

2、mysql的注释方式没有//,只有/**/和#

3、存储过程的前后要先定义分隔符DELIMITER

因此最终结果:

DELIMITER 

CREATE 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_employees 

delimiter $$

-- 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) ...

这样再试试


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8427245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存