数据库存储过程创建可能出现的问题

文章目录

  • 数据库存储过程创建可能出现的报错问题
    • 1064 - You have an error in your SQL syntax;
      • 错误:变量定义
    • 1054 - Unknown column 'uid' in 'field list'
      • 错误:查询来源
    • 1406 - Data too long for colum '字段名' at row 1
      • 错误:字符长度
    • 1318 - Incorrect number of arguments for PROCEDURE on.upLoginUser...
      • 错误:参数数量不一致
    • 编译正常没有报错,输出结果不对
      • 错误:输出不正确
      • 正确编写
    • 小技巧

数据库存储过程创建可能出现的报错问题

例如:使用存储过程判断输入用户名和密码是否正确,返回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);

数据库存储过程创建可能出现的问题_第1张图片

存储过程没有报错,传参失败,不知道存储过程中使用的参数来自哪里
改为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');
密码长度超出定义.

数据库存储过程创建可能出现的问题_第2张图片

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

数据库存储过程创建可能出现的问题_第3张图片

小技巧

如果编写过程中出错了,可以使用‘drop PROCEDURE 过程名’进行删除,然后接着在原来的上面进行改写。如果出现其他的错误可以先试着翻译一下,看看哪里出现异常不对,解决不了再去寻求解析。这样对于这种错误印象会更加深刻,下次就会马上想起来。

你可能感兴趣的:(数据库,sql,mysql,笔记)