前言:
而今咱们对“mysql存储过程调用 参数怎么写要定义吗”大致比较着重,各位老铁们都需要剖析一些“mysql存储过程调用 参数怎么写要定义吗”的相关内容。那么小编在网上网罗了一些关于“mysql存储过程调用 参数怎么写要定义吗””的相关文章,希望你们能喜欢,朋友们快快来学习一下吧!in模式参数写法
in 参数名 参数类型
先准备一些数据,现在数据库中有员工表和部门表。
show create table emp; CREATE TABLE `emp` ( `id` int(255) NOT NULL AUTO_INCREMENT, `ename` varchar(255) DEFAULT NULL, `job` varchar(255) DEFAULT NULL, `sal` int(11) DEFAULT NULL, `deptNo` int(11) DEFAULT NULL, `hiredate` datetime NOT NULL, `bonus` int(11) DEFAULT NULL, `orderNo` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
员工表数据:
show create table department; CREATE TABLE `department` ( `id` int(11) NOT NULL AUTO_INCREMENT, `deptName` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
一个参数
创建一个存储过程,实现根据员工姓名,显示他所在部门的信息。
员工姓名就是传入的参数,定好参数名为name,类型是字符型。
存储过程体就是一条根据name查找部门信息的sql,可以联表查询。
所以此存储过程的创建如下:
mysql> DELIMITER &mysql> CREATE PROCEDURE p1(in name VARCHAR(20)) -> BEGIN -> select d.* from emp e,department d -> where e.deptNo = d.id -> and e.ename = name; -> END &Query OK, 0 rows affected (0.00 sec)
name参数相当于一个局部变量,可以直接在存储过程体的sql语句中使用。调用存储过程测试一下,参数我们可以自定义一个用户变量,这里就传一个常量。
mysql> call p1('Emma')&+----+----------+| id | deptName |+----+----------+| 1 | deptA |+----+----------+1 row in set (0.00 sec)
多个参数
以上是一个参数的情况,创建比较简单,现在创建有多个参数的存储过程p2。
以两个数据为例,模拟一个用户登陆的情况。
先看一下manager管理员表数据:
我们登陆系统一般都需要输入用户name和密码password,以这两个数据为条件,查询manager表,返回行数,行数大于0,登陆成功,等于0则登陆失败。
select count(*) from manager where name = name and pwd = password;
我们还可以将这个结果赋给一个变量,begin end中使用局部变量,可以这样定义:
DECLARE result int default 0;
result定义为int类型,默认值是0。
我们还可以将查询结果赋值给result变量,在MySQL基础之变量有提过两种方法,在这里使用select into方法
elect count(*) into result from manager where name = name and pwd = password;
使用变量
select result;
为了更好的提醒用户,我们可以使用if函数作判断,如果result大于0,返回登陆成功,否则登陆失败。
if函数
IF(expr1,expr2,expr3)
表达1为要判断的条件语句,结果为真时返回表达2的结果,结果false时返回表达3的结果。
select IF(result >0 ,'登陆成功','登陆失败');
所以整个存储过程创建语句如下:
CREATE PROCEDURE p2(in name VARCHAR(20),in password VARCHAR(20))BEGIN DECLARE result int default 0; select count(*) into result from manager where name = name and pwd = password; select IF(result >0 ,'登陆成功','登陆失败');END &
此时还有一个问题要注意,看 where name = name ,两个name相同。先放一下,看测试结果:
出现了乱码,查看一下数据库字符集信息,
将character_set_server变量的值改为utf8,赋值或更新变量用set
mysql> set character_set_server = utf8&Query OK, 0 rows affected (0.00 sec)
将存储过程删除了,重新创建,删除如下:
mysql> drop procedure p2 &Query OK, 0 rows affected (0.00 sec)
调用结果
mysql> call p2('John','123456')&+--------------------------------------+| IF(result >0 ,'登陆成功','登陆失败') |+--------------------------------------+| 登陆成功 |+--------------------------------------+1 row in set (0.00 sec)
用户名John,密码123456的数据在manager表有存在,所以结果是成功。
改一下name的值,John_2,这个用户在manager表是不存在的,看看结果是怎样
mysql> call p2('John_2','123456')&+--------------------------------------+| IF(result >0 ,'登陆成功','登陆失败') |+--------------------------------------+| 登陆成功 |+--------------------------------------+1 row in set (0.00 sec)
依然是成功,其实问题出在name = name这个条件。在存储过程中,两个name都是输入参数,所以两者恒等,结果自然是真。
参数名和要查询表的列名最好不要相同,相同的话我们可以使用别名解决。
CREATE PROCEDURE p2(in name VARCHAR(20),in password VARCHAR(20))BEGIN DECLARE result int default 0; select count(*) into result from manager m where m.name = name and pwd = password; select IF(result >0 ,'登陆成功','登陆失败'); END &
结果可以自行测试一下。
本文主要整理存储过程中in模式参数创建和使用,以及一些注意点,也涉及到变量的用法,还有if函数的使用等。