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

员工表数据:




sql server 带参数的存储过程declare sql存储过程的in参数_mysql


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


sql server 带参数的存储过程declare sql存储过程的in参数_数据_02


一个参数

创建一个存储过程,实现根据员工姓名,显示他所在部门的信息。

员工姓名就是传入的参数,定好参数名为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管理员表数据:


sql server 带参数的存储过程declare sql存储过程的in参数_mysql存储过程输入参数拆分_03


我们登陆系统一般都需要输入用户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相同。先放一下,看测试结果:


sql server 带参数的存储过程declare sql存储过程的in参数_数据_04


出现了乱码,查看一下数据库字符集信息,


sql server 带参数的存储过程declare sql存储过程的in参数_mysql_05


将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函数的使用等。