建表
CREATE TABLE if not exists `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;
insert into admin(username,password) values
('php','999'),
('javascript','000'),
('java','444'),
('html','444'),
('python','333');
select * from admin;
存储过程简单来说就是把几句sql语句放在一起,一起执行
1.要用delimiter把结束标志改掉
因为每行sql语句都要用;结尾,编辑器看到;号就会直接运行,一段存储过程就被拆得七零八落了,所以我们用delimiter把结束标志;改成美元$
delimiter $ 要放在第一行
然后存储过程中的sql语句后面还是以;结束,但是不会再自动运行了
整个存储过程以$ 结尾
往后的要运行的语句也要$结尾
举例
无参存储过程
#把默认结束标记;改成$
delimiter $
#创建存储过程 mypro()
create procedure mypro()
begin
insert into admin(username,password)
values
('vb','333'),
('vc','444');
delete from admin where id =6;
end $
建好后,在navicat15中显示在函数里面
上面只是创建了一个存储过程,相当于把几行sql语句存储了起来,但是并没有运行
运行还需要调用一下
call mypro()
这样就运行了,再来查看一下结果,先插入6和7,然后删除6,结果没错
带in参数的存储过程
#创建带in参数的存储过程
delimiter $
create procedure myproin(in name varchar(20))
begin
delete from admin where username = name;
select * from admin;
end $
#调用存储过程
call myproin('java') $
在存储过程中存了两句语句
一句是带输入参数的删除语句
一句是查询,调用后直接就显示结果了,省得再查询,而且存储过程里只放一句sql也不像样,加一句凑数
调用时传入参数'java',运行后成功删除第3行的java
再建一个带两个in参数的存储过程
两个参数就可以代替用户名和密码了
delimiter $
create procedure myproin3(in name varchar(20),in psw varchar(20))
begin
#定义一个局部变量
declare result int default 0;
#把查询到的数值赋值给局部变量
select count(*) into result from admin where username=name and password=psw;
#什么都有,不知道还要java干嘛
select IF(result>0,'登陆成功','登陆失败');
end $
测试一下,先输入一个存在的,再输入一个不存在的
带OUT参数的存储过程
delimiter $
#out参数就相当于一个自定义变量
CREATE PROCEDURE `myproout`(in name varchar(20),out psw varchar(20))
begin
#把查询结果赋值给out参数
select password into psw from admin where username=name;
select psw;
end $
调用
#这里OUT参数要写变量@....
call myproout('php',@psw)$
调用结果
带INOUT参数的存储过程
delimiter $
create procedure myproinout(inout a int,inout b int)
begin
set a = 2*a;
set b = 2*b;
select a,b;
end $
调用
调用的时候还在delimiter $运行窗口的话,结尾要用$,不是的话结尾就可以用回;