数据库存储过程创建可能出现的报错问题
例如:使用存储过程判断输入用户名和密码是否正确,返回1,登陆成功;返回0,登录失败。
1064 - You have an error in your SQL syntax;
错误:变量定义
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 'int ;
语法错误,在存储过程中定义变量需要使用局部变量DECLARE进行声明。
即 DECLARE num int ;
delimiter// CREATE PROCEDURE upLoginUser(in in_name varchar(10),in pwd varchar(10)) no sql begin num int ; select count(uid) as num from users where uname=in_name and upwd=pwd; if num=1 then select '登陆成功'; else select '登陆失败'; end if; end // //> 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 'int ; //语法错误,在存储过程中定义变量需要使用局部变量DECLARE进行声明。 //即 DECLARE num int ;
1054 - Unknown column ‘uid’ in ‘field list’
错误:查询来源
delimiter// CREATE PROCEDURE upLoginUser( in_name varchar(10), pwd varchar(10)) no sql begin DECLARE num int ; 这里: select count(uid) as num where uname=in_name and upwd=pwd; if num=1 then select '登陆成功'; else select '登陆失败'; end if; end // set @in_name='郭辉'; set @pwd='0a1'; call upLoginUser(@in_name,@pwd);
存储过程没有报错,传参失败,不知道存储过程中使用的参数来自哪里
改为select count(uid) as num from users where uname=in_name and upwd=pwd;
1406 - Data too long for colum ‘字段名’ at row 1
错误:字符长度
比如你一开始给字段定义了长度,赋值的时候忘记了就可能出现错误。
call upLoginUser('小白','rhtr5e6ujr67u');
密码长度超出定义.
1318 - Incorrect number of arguments for PROCEDURE on.upLoginUser…
错误:参数数量不一致
存储过程接收的参数和传进去的参数数目不一致,需要1个,有两个
delimiter// CREATE PROCEDURE upLoginUser( in_name varchar(10)) no sql begin DECLARE num int ; select count(uid) as num from users where uname=in_name and upwd=pwd; if num=1 then select '登陆成功'; else select '登陆失败'; end if; end // set @in_name='郭辉'; set @pwd='0a1'; call upLoginUser(@in_name,@pwd);
编译正常没有报错,输出结果不对
错误:输出不正确
输出不正确,别名name和局部变量的作用域不一致,无法关联,判断正确却没有办法输出正确结果。
delimiter// CREATE PROCEDURE upLoginUser( in_name varchar(10), pwd varchar(10)) no sql begin DECLARE num int ; select count(uid) as num from users where uname=in_name and upwd=pwd; if num=1 then select '登陆成功'; else select '登陆失败'; end if; end // set @in_name='郭辉'; set @pwd='0a1'; call upLoginUser(@in_name,@pwd);
输出不正确,别名name和局部变量的作用域不一致,无法关联,判断正确却没有办法输出正确结果。
正确编写
delimiter// CREATE PROCEDURE upLoginUser(in in_name varchar(10),in pwd varchar(10)) no sql begin DECLARE num INT; set num = (select count(uid) from users where uname=in_name and upwd=pwd); select if( num>0 ,'登陆成功', '登陆失败') as login; end // set @in_name='小白'; set @pwd='0a1'; call upLoginUser(@in_name,@pwd);
小技巧
如果编写过程中出错了,可以使用‘drop PROCEDURE 过程名’进行删除,然后接着在原来的上面进行改写。如果出现其他的错误可以先试着翻译一下,看看哪里出现异常不对,解决不了再去寻求解析。这样对于这种错误印象会更加深刻,下次就会马上想起来。