13
回答
mysql存储过程,我做了一个简单的,为甚麽总是出错?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

功能:写一个存储过程:同时增加一条学生基本信息和该学生2门课程成绩;

代码:CREATE PROCEDURE pro_insert(in p VARCHAR)BEGIN
DECLARE v1 VARCHAR
SET v1=p
INSERT INTO student1(id) VALUES(v1);
END
CALL pro_insert(1)
SELECT * FROM student1;

错误截图:

Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')

BEGIN
DECLARE v1 VARCHAR
SET v1=p
INSERT INTO student1(id) VALUES(v1);
' at line 1

举报
共有13个答案 最后回答: 1年前

字符集的问题,估计你的客户端与server的字符集不一致

drop procedure if exists pro_insert;

delimiter //
CREATE PROCEDURE pro_insert(in p VARCHAR(255) CHARSET  utf8)
BEGIN
DECLARE v1 varchar(255) CHARACTER SET utf8;
SET v1=p;
INSERT INTO student1(id) VALUES(v1);
END

//

delimiter ;




--- 共有 1 条评论 ---
飞天小猪猪我把代码按你说的改了,还是有错 1年前 回复
看看是不是1应该是‘1’,字符类型的
--- 共有 2 条评论 ---
vikde回复 @飞天小猪猪 : 1、varchar不是类型,varchar(1)这种才是 2、用个好点的编辑器吧,写上就报红叉了,比如自带的workbench 3、百度去,多了去的解答 1年前 回复
飞天小猪猪你看看下面的错误,我改为了'1' 1年前 回复
DECLARE v1 VARCHAR

SET v1=p


你还问为什么老出错,我说为啥不出错,你看看你的语法正确吗,sql语句后面的分隔符呢,默认都是; 你这两句和insert 一起合并成一句sql,你觉得正常吗

--- 共有 2 条评论 ---
-_-_-_-__回复 @飞天小猪猪 : 我靠你把上面语句全写在一起了? 1年前 回复
飞天小猪猪我把两个分割符加上后和原来得报错提醒一样 1年前 回复

引用来自“yizhilong”的评论


字符集的问题,估计你的客户端与server的字符集不一致

drop procedure if exists pro_insert;

delimiter //
CREATE PROCEDURE pro_insert(in p VARCHAR(255) CHARSET  utf8)
BEGIN
DECLARE v1 varchar(255) CHARACTER SET utf8;
SET v1=p;
INSERT INTO student1(id) VALUES(v1);
END

//

delimiter ;




是这个吗?不行啊

delimiter //

delimiter ;

很多时候,是这2句的问题,一般都要先重定义语义结束符,默认是";",先重定义成 "//",用完之后,再换回 ";"。因为你不这么做,你存储过程内的分号会被当作“语句结束了”来执行,这样整个语句就报错了。


--- 共有 1 条评论 ---
飞天小猪猪谢谢 1年前 回复
顶部