MySQL 存储过程入门

存储过程是带有逻辑的SQL语句,优点是执行效率高。缺点是可移植性差

1、存储过程语法

DELIMITER $  --声明结束符
CREATE PROCEDURE pro_test()  --创建存储过程    存储过程名称(参数列表)
BEGIN
    SELECT * FROM employee  --可以写多条SQL语句   SQL语句+流程控制
END $ --结束

2、调用存储过程

CALL pro_test  --CALL 存储过程名称

3、储存过程参数

IN            表示输入参数

OUT         表示输出参数

INOUT     表示输入、输出参数

3.1带有输入参数的存储过程

需求:通过传入一个员工的id,查询员工信息

DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT)   --IN: 输入参数
BEGIN
    SELECT * FROM employee WHERE id = eid;
END $

调用

CALL pro_findById(2);

3.2 带有输出参数的存储过程

DELIMITER $
CREATE PROCEDURE pro_testOut (OUT str VARCHAR(20))
BEGIN 
    SET str="这是一个输出参数";
END $

调用带返回参数的存储过程

先介绍下MySQL变量
1、全局变量(内置变量)
    查看所有全局变量 show variables
   查看跟字符集有关的全局变量 SHOW VARIABLES LIKE 'character_%';
   查看某个全局变量 SELECT @@变量名
修改全局变量 SET 变量名=新值
常用全局变量
--character_set_client : mysql服务器能够接收数据的编码 --character_set_results : mysql服务器输出数据的编码
2、会话变量:只存在于当前的客户端与数据库服务器端的一次连接当中,如果连接断开,会话丢失
  定义一个会话变量 SET @变量=值
  查看会话变量 SELECT @变量
3、局部变量:在存储过程中使用的变量 就是存储变量,只存储过程执行完毕,那么局部变量就会消失。

变量介绍完,现在说明如何调用带输出参数的存储过程
1、定义一个会话变量
CALL pro_testOut(@NAME) //1)定义一个会话变量NAME,2)使用NAME会话变量
2、查看会话变量
SELECT @NAME;

3.3带有输入输出参数的存储过程

DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)   --INOUT输入输出参数
BEGIN 
    SELECT n;   --作为输入参数传入存储过程,  该变量变为局部变量 不用加'@',但在存储过程外仍然是会话变量
    SET n = 500;
END $

--调用
输入
SET @n = 10;    
CALL pro_testInOut(@n);  --结果输出10


输入
SELECT @n; --结果输出500

4、带有条件判断的存储过程

需求:输入一个整数。如果为1,则返回“星期一”,如果是2,则返回“星期二”,如果是3,则返回“星期三”。如果 是其他数值,返回“错误的数值”

DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT, OUT str VARCHAR(10))
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 pro_testIF(1, @str); SELECT @str;

5、带有循环功能的存储过程

--需求:输入一个整数,求和。例如输入100.求1-100的和

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 $ 


--调用
CALL pro_testWhile(100, @result);

SELECT @result;

6、使用查询结果作为返回值

DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT, OUT vnaem VARCHAR(20))
BEGIN
    SELECT empName INTO vname FROM employee WHERE id = eid;
END $

--调用
CALL pro_findByID(1, @NAME);

SELECT @NAME

 7、删除存储过程

DROP PROCEDURE 存储过程名称
原文地址:https://www.cnblogs.com/StanLong/p/6864558.html