目录
一、什么是存储过程?
二、存储过程的作用
三、如何创建、调用、查看、删除、修改存储过程
四、存储过程的参数(输入参数,输出参数,输入输出参数)
第一种:输入参数
第二种:输出参数
第三种:输入输出参数
五、存储过程中的条件与循环语句
第一种:if条件的存储过程
第二种:while循环的存储过程
六、如何一次性往数据库中插入上万条数据?
第一种存储过程实现上万数据插入
第二种shell脚本实现上万数据插入
存储过程是一组为了完成特定功能的SQL语句的集合。有点shell脚本的意思
存储过程在使用过程中,是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化存储在数据库服务器中,当需要使用该存储过程的时候,只需要调用即可。存储过程在执行上比传统的SQL语句速度更快,执行的效率也更高。
优点:
1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率;
2、SQL语句加上控制语句的集合,灵活性高;
3、在服务器端存储,客户端调用时,降低网络负载;
4、可以多次重复调用存储过程,也可以随时修改,不影响客户端的调用;
5、可以完成所有数据库的操作,也可以控制数据库的信息访问权限。
存储过程也是一种对象,增删改查的命令可以套用DDL的相关语句
存储过程是创建在库中的,需要先用use切换库,否则需要在创建的时候,指定库名
##创建存储过程了
delimiter 结束符 ##先自定义结束符,因为存储过程中的SQL语句用分号结尾,这时需要修改作为区分
create procedure 存储过程名称()
begin
SQL语句集合
end结束符号
delimiter ; ##将结束符修改回为分号
##查看存储过程
show create procedure [库名].存储过程名称;
show procedure status like '存储过程名称' \G; ##支持通配符
##调用存储过程
call 存储过程名称;
##删除存储过程
drop procedure 存储过程名称;
drop procedure if exists 存储过程名称; ##如果存在则删除
修改存储过程的方法:
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
总结就是重新创建储存过程,没有直接删除的方法
可以在存储过程创建的时候加入参数,
创建存储过程定义的参数叫形式参数,create procedure 存储名称(形式参数)
调用的时候添加的参数叫做实际参数call 存储名称(实际参数)
delimiter $$
CREATE PROCEDURE proc2(in in_name VARCHAR(20))
BEGIN
INSERT INTO t3 (NAME)VALUES(in_name);
END$$
delimiter ;
CALL proc2('wwy');
delimiter $$
CREATE PROCEDURE proc3(in in_id INT,OUT out_name varchar(20))
BEGIN
SELECT NAME INTO out_name FROM t3 where id=in_id;
END$$
delimiter ;
CALL proc3(2,@dest);
SELECT @dest;
##select 字段或聚合函数 into +输出参数名称 from 表名 where 条件
##输出参数的值一般是一个确定的值,多个会报错
单个案例举例,针对存储过程的输出参数,如果是2个值,可能不可以实现,
必须是只有1个特定的值
输入输出参数首先需要满足出入的和输出的数据类型是一致的!! 比如都为int数字 或者都为varchar
delimiter $$
CREATE PROCEDURE proc4(INOUT i INT)
BEGIN
SELECT COUNT(name) INTO i FROM t3 where id>i;
END$$
delimiter ;
SET a=5;
CALL proc4(@a);
SELECT @a;
delimiter $$
CREATE PROCEDURE proc5(IN in_id INT)
BEGIN
DECLARE m INT;
SET m=in_id;
IF m>=4 THEN UPDATE t3 SET grade='good';
ELSE UPDATE t3 SET grade='bad';
END if;
END$$
mysql> delimiter $$
mysql> create procedure proc6()
-> begin
-> declare m int;
-> set m=1;
-> create table t4(id int primary key auto_increment,name varchar(20));
-> while m<10 do
-> insert into t4(name)values(concat('student',m));
-> set m=m+1;
-> end while;
-> end$$
有两种方式 存储过程和shell脚本
一百万条数据 用时50秒