Mysql_知识总结04(存储过程的建立、调用)
-- 数据库的存储过程
-- 定义一个结束符号:delimiter $
DELIMITER $
CREATE PROCEDURE testByPro()
BEGIN
-- 书写sql语句
SELECT *FROM dept;
END $
-- 调用存储过程
CALL testByPro();
DELIMITER $
CREATE PROCEDURE testByPro03()
BEGIN
-- select *from dept;
SELECT *FROM employee;
END $
CALL testByPro03();
-- 带有参数的存储过程
-- 需求:插入员工id,查询对应的员工
DELIMITER $
CREATE PROCEDURE pro_testByIn(IN eid INT)
-- 存储过程名称(形式参数:参数类型+参数名称+字段类型)
BEGIN
SELECT *FROM employee WHERE id = eid;
END $
-- 调用
CALL pro_testByIn(2);
-- 带有输出参数的存储过程(输出参数)
DELIMITER $
CREATE PROCEDURE pro_testByOut(OUT n VARCHAR(20))
BEGIN
-- 在存储过程中:局部变量 修改局部变量 set 数据
SET n = '大家好,为什么你们还不回我微信' ;
END $
-- 调用带有参数的存储过程
CALL pro_testByOut(@n); -- 带出来一个会话变量
-- 执行了存储过程,@n已经有数据了
-- 查询会话变量
SELECT @n;
-- 数据库中的全局变量分为三种
-- 1)数据库中的全局变量:当前mysql一启动,mysql就会有一些全局变量,常驻内存的!
-- 全局变量共有331条数据
-- 显示当前mysql数据库的全局变量
SHOW VARIABLES;
-- 模糊条件查询跟字符集相关的变量
SHOW VARIABLES LIKE 'character%';
-- 2)会话变量(实际的存储过程中,应用的会话变量最多)
-- 会话变量在登录mysql客户端设置一些会话变量,一旦客户端关闭,会话变量就失效了
-- 3)局部变量
-- 在存储过程中定义的变量
-- 带有输入输出参数的存储过程(inout 后面参数名称:既可以携带到存储过程中,也可以通过会话变量查看)
DELIMITER $
CREATE PROCEDURE testByInOut(INOUT n VARCHAR(20))
BEGIN
-- 先查看局部变量
SELECT n;
-- 修改变量
SET n = '500';
END $
-- 给n初始值
SET @n='10';
CALL testByInOut(@n);
-- 现在查看n的值
SELECT @n;
-- 带有条件判断语句的存储过程
DELIMITER $
CREATE PROCEDURE testByIf(IN n INT,OUT str VARCHAR(20))
BEGIN
IF n=1 THEN
SET str = 'sunday&monday';
ELSEIF n=2 THEN
SET str = 'tuesday&weddnesday';
ELSEIF n=3 THEN
SET str = 'thursday&friday&saturday';
ELSE
SET str = 'error!';
END IF;
END $
-- 调用存储过程
CALL testByIf(3,@str);
CALL testByIf(5,@str);
-- 查看
SELECT @str;
-- 带有循环语句的存储过程
-- 插入一个num值,求1到num的和
DELIMITER $
CREATE PROCEDURE testByWhile(IN num INT,OUT score INT)
BEGIN
DECLARE result INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
WHILE i<= num DO
SET result = result +i; -- 修改局部变量
SET i = i + 1;
END WHILE;
SET score = result; -- 相当于return语句
END $
-- 调用存储过程
CALL testByWhile(200,@score);
SELECT @score;
-- 携带数据库中的数据给输出参数(into)
-- 需求:传入员工id,查询对应的员工,输出员工的姓名
DELIMITER $
CREATE PROCEDURE testByInto(IN eid INT,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM employee WHERE id = eid;
END $
-- 调用
CALL testByInto(3,@sname);
SELECT @sname;
-- 定义一个结束符号:delimiter $
DELIMITER $
CREATE PROCEDURE testByPro()
BEGIN
-- 书写sql语句
SELECT *FROM dept;
END $
-- 调用存储过程
CALL testByPro();
DELIMITER $
CREATE PROCEDURE testByPro03()
BEGIN
-- select *from dept;
SELECT *FROM employee;
END $
CALL testByPro03();
-- 带有参数的存储过程
-- 需求:插入员工id,查询对应的员工
DELIMITER $
CREATE PROCEDURE pro_testByIn(IN eid INT)
-- 存储过程名称(形式参数:参数类型+参数名称+字段类型)
BEGIN
SELECT *FROM employee WHERE id = eid;
END $
-- 调用
CALL pro_testByIn(2);
-- 带有输出参数的存储过程(输出参数)
DELIMITER $
CREATE PROCEDURE pro_testByOut(OUT n VARCHAR(20))
BEGIN
-- 在存储过程中:局部变量 修改局部变量 set 数据
SET n = '大家好,为什么你们还不回我微信' ;
END $
-- 调用带有参数的存储过程
CALL pro_testByOut(@n); -- 带出来一个会话变量
-- 执行了存储过程,@n已经有数据了
-- 查询会话变量
SELECT @n;
-- 数据库中的全局变量分为三种
-- 1)数据库中的全局变量:当前mysql一启动,mysql就会有一些全局变量,常驻内存的!
-- 全局变量共有331条数据
-- 显示当前mysql数据库的全局变量
SHOW VARIABLES;
-- 模糊条件查询跟字符集相关的变量
SHOW VARIABLES LIKE 'character%';
-- 2)会话变量(实际的存储过程中,应用的会话变量最多)
-- 会话变量在登录mysql客户端设置一些会话变量,一旦客户端关闭,会话变量就失效了
-- 3)局部变量
-- 在存储过程中定义的变量
-- 带有输入输出参数的存储过程(inout 后面参数名称:既可以携带到存储过程中,也可以通过会话变量查看)
DELIMITER $
CREATE PROCEDURE testByInOut(INOUT n VARCHAR(20))
BEGIN
-- 先查看局部变量
SELECT n;
-- 修改变量
SET n = '500';
END $
-- 给n初始值
SET @n='10';
CALL testByInOut(@n);
-- 现在查看n的值
SELECT @n;
-- 带有条件判断语句的存储过程
DELIMITER $
CREATE PROCEDURE testByIf(IN n INT,OUT str VARCHAR(20))
BEGIN
IF n=1 THEN
SET str = 'sunday&monday';
ELSEIF n=2 THEN
SET str = 'tuesday&weddnesday';
ELSEIF n=3 THEN
SET str = 'thursday&friday&saturday';
ELSE
SET str = 'error!';
END IF;
END $
-- 调用存储过程
CALL testByIf(3,@str);
CALL testByIf(5,@str);
-- 查看
SELECT @str;
-- 带有循环语句的存储过程
-- 插入一个num值,求1到num的和
DELIMITER $
CREATE PROCEDURE testByWhile(IN num INT,OUT score INT)
BEGIN
DECLARE result INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
WHILE i<= num DO
SET result = result +i; -- 修改局部变量
SET i = i + 1;
END WHILE;
SET score = result; -- 相当于return语句
END $
-- 调用存储过程
CALL testByWhile(200,@score);
SELECT @score;
-- 携带数据库中的数据给输出参数(into)
-- 需求:传入员工id,查询对应的员工,输出员工的姓名
DELIMITER $
CREATE PROCEDURE testByInto(IN eid INT,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM employee WHERE id = eid;
END $
-- 调用
CALL testByInto(3,@sname);
SELECT @sname;