存储过程
这是什么
- 一组可编程的函数,是为了完成特定功能的SQL语句集
- 存储过程就是具有名字的一段代码.用来完成一个特定 的功能
- 创建存储过程保存在数据库的数据字典中
为什么用
- 将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用
- 批量处理
- 统一接口,确保数据的安全
- 相对于oracle数据库来说,mysql的存储过程相对功能比较弱,使用较少
存储过程的创建和调用
delimiter
原来我们是这样执行我们的sql语句的(封号意味着sql语句的结束)
使用delimiter设置
例子
delimiter $$$ select * from xxx $$$
delimiter总结
- 它与存储过程语法无关
- delimiter语句将标准分隔符 - 分号(;)更改为:$$
- 因为我们想将存储过程作为整体传递给服务器
- 而不是让mysql工具一次解释每个语句
- 告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号(;)在命令行客户端中,如果有一行命令以分号结束,那么回车以后,mysql将会执行该命令.但是有的时候,我们不希望mysql这么做.在为可能输入较多的语句且语句中包含分号就可以通过使用delimiter
出现后,mysql解释器才会执行这段语句
创建存储过程
语法:
CREATE PROCEDURE 名称()
BEGIN
语句
END$$
调用存储过程
语法:
CALL 名称();
查看存储过程
查看所有存储过程
SHOW PROCEDURE STATUS;
查看指定数据库的存储过程
SHOW PROCEDURE STATUS WHERE db = '数据库的名字'
查看指定存储过程源代码
SHOW CREATE PROCEDURE 存储过程名;
删除存储过程
DROP PROCEDURE show_emp;
存储过程变量
在存储过程中声明一个变量使用
DECLARE
例子
delimiter $$ CREATE PROCEDURE test() BEGIN -- 声明2个变量 DELCLARE res VARCHAR(255) DEFAULT ''; DELCLARE x,y INT DEFAULT 0; SELECT AVG(salary) FROM emp; END$$
分配变量值
要为变量分配一个值,可以使用SET语句
delimiter $$
CREATE PROCEDURE test()
BEGIN-- 声明2个变量
DELCLARE res VARCHAR(255) DEFAULT '';
DELCLARE x,y INT DEFAULT 0;-- 设置变量
SET x = 3;
SET y = 4;SELECT AVG(salary) FROM emp;
END$$
使用SELECT INTO语句将查询的结果分配给一个变量
DELCLARE avgRes DOUBLE DEFAULT 0;
SELECT AVG(salary) INTO avgRes FROM emp
变量范围
存储过程参数
三种类型
IN
OUT
INOUT
- 根据传入的名称,获取对应的信息
-- IN
delimiter $$
CREATE PROCEDURE getName(IN name VARCHAR(255))
BEGIN
SELECT * FROM emp WHERE ename = name;
END$$
delimiter;
-- 调用(查鲁班)
CALL getName('鲁班');
-- 调用(查李白)
CALL getName('李白');
-- INOUT
delimiter $$
CREATE PROCEDURE test(INOUT num INT,in inc INT)
BEGIN
SET num = num + inc
END$$
delimiter;
SET @num1 = 20;
CALL test(@num1,10);
SELECT @num1;
-
给我一个名字,找到这个名字的薪资
-- OUT delimiter $$ CREATE PROCEDURE getSalary(IN name VARCHAR(255),OUT salary INT) BEGIN SELECT salary INTO salary FROM emp WHERE ename = n; END$$ delimiter; CALL getSalary('鲁班',@sy) SELECT @sy;
-
语法
CREATE PROCEDURE name(模型 参数名称 数据类型 (大小))
存储过程语句
IF语句
IF expression THEN
statements;
END IF;
CASE语句
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE;
循环
第一种:
WHILE expression DOstatementsEND WHILE
第二种:
REPEAT
statements
UNTIL expression
END REPEAT
网友评论