前言:
之前插入数据我们都是重复 粘贴复制,粘贴复制
这是多么繁琐的一个过程,而且效率低
这个时候存储过程就派上用场了。
我是这么理解的:
存储过程是带有逻辑的SQL语句,可以同时执行多条操作语句的函数
特点:
处理多条数据操作时效率高。
原因:存储过程是 提前预编译好在数据库中,在数据库的服务器端执行的
缺点:
移植性很差!不同数据库的存储过程是不能移植。
先来了解下这两个SQL语句:
//查看数据库中全部的存储过程函数
show procedure status;
//查看指定名称的存储过程函数的具体内容
show create procedure proc_name; 、
//删除指定的存储过程
DROP PROCEDURE pro_testWhile;
格式:
mysql> delimiter $$
mysql> CREATE PROCEDURE 函数名(参数)
-> BEGIN
带逻辑的SQL语句
-> END$
mysql> delimiter
$
将语句的结束符号从分号;临时改为$
符号(可以是自定义)
记得最后还是要mysql> delimiter;
将语句的结束符号恢复为分号(你也可以直接关掉cmd这样这个分隔符又有效了)
注意:存储过程的函数名字是不区分大小写的。
那如何调用该存储过程呢?
CALL 函数(参数);
参数有三个类型:
IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能
参数的有效范围:
* 全局变量(内置变量):*
-- 查看所有全局变量: show variables
-- 查看某个全局变量: select @@变量名
-- 修改全局变量: set 变量名=新值
会话变量:
只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!
-- 定义会话变量: set @变量=值
-- 查看会话变量: select @变量
局部变量:
在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失!!
注意:一般都是采用会话变量来存储从存储过程返回的值
定义一个变量:
方法一:
需要赋值。set和值
定义一个会话变量name,
set @name=值;
方法二:
直接接收存储过程的值,不需要set
使用name会话变量接收存储过程的返回值
CALL pro_testOut(@NAME);
查看变量值
SELECT @NAME;
举例:
传入参数IN
CREATE PROCEDURE pro_findById(IN eid INT)
BEGIN
SELECT * FROM employee WHERE id=eid;
END $
传出参数OUT:
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20))
BEGIN
SET str='helljava';
END $
输入输出参数:
-- 3.3 带有输入输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)
BEGIN
-- 查看变量
SELECT n;
SET n =500;
END $
-- 调用
SET @n=10;
CALL pro_testInOut(@n);
SELECT @n; //此时@n为500
注意在存储过程中 虽然传入的是会话值 @参数,但是在函数中操作的时候是视为局部内容来操作的,如:@n在存储过程中赋值是SET n=500;
重点:
带有条件判断的存储过程:
CREATE PROCEDURE haha(IN num INT,OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str='星期一';
ELSEIF num=2 THEN
SET str='星期二';
ELSEIF num=3 THEN
SET str='星期三';
ELSE
SET str='输入错误';
END IF;
END $
CALL haha(4,@str);
SELECT @str;
带有循环功能的存储过程:
DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
-- 定义一个局部变量
DECLARE i INT DEFAULT 1;
DECLARE vsum INT DEFAULT 0;
WHILE i<=num DO
SET vsum = vsum+i;
SET i=i+1;
END WHILE;
SET result=vsum;
END $
注意:定义一个值为1的局部变量:
DECLARE i INT DEFAULT 1;
使用查询的结果赋值给变量(INTO):
DELIMITER $
CREATE PROCEDURE haha(IN eid INT,OUT vname VARCHAR(20) )
BEGIN
SELECT empName INTO vname FROM employee WHERE id=eid;
END $
CALL haha(1,@NAME);
SELECT @NAME;
得到的值empName 赋值给vname 关键字是:INTO
注意:INTO 多行同时给一个变量时会报错