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参数的存储过程 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 $
测试一下,先输入一个存在的,再输入一个不存在的
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)$
调用结果
delimiter $ create procedure myproinout(inout a int,inout b int) begin set a = 2*a; set b = 2*b; select a,b; end $
调用
调用的时候还在delimiter $运行窗口的话,结尾要用$,不是的话结尾就可以用回;