MySQL存储过程
-- MySQL存储过程(属于数据对象)(Java 方法)(优点:1:编译好存储在服务器
-- (1:执行效率高(存储过程的语句都是先编译(创建存储过程时候就编译好了)))
-- 2:安全性高(把不公开的数据或者业务封装在存储过程中,外部不需要知道内部的实现细节)
-- 3:减少网络流量
-- 4:支持模块化)
SHOW PROCEDURE STATUS;//显示数据库中所有的存储过程
SHOW CREATE PROCEDURE proc;//显示某个存储过程的详细信息(proc为存储过程名称)
DROP PROCEDURE IF EXISTS proc;//删除某个存储过程(proc为存储过程名称)
CALL proc();//调用存储过程(proc为存储过程名称)
结构:
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc()
BEGIN
SELECT '存储过程';
END //
示例:
1)
DELIMITER //
CREATE PROCEDURE proc()
BEGIN
DECLARE num INT(3);
SET num=10;
SELECT num+20;
END //
调用存储过程:CALL proc(); =>21
2)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc()
BEGIN
DECLARE num INT(3) DEFAULT 1;
SELECT num+20;
END //
调用存储过程:CALL proc(); =>21
3)
-- in 参数(参数输入模式)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3),j INT(3))
BEGIN
SELECT i+j;
END //
调用存储过程:CALL proc(1, 1); =>2
4)
-- out 参数(参数输出模式)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3),j INT(3),OUT result INT(3))
BEGIN
SET result=i+j;
END //
调用存储过程:SET @result=10;//在此处还没有发现此步骤的用处
CALL proc(1, 1, @result);
SELECT @result; =>2
5)
-- inout 参数(即为输入参数也是输出参数)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3),j INT(3),INOUT result INT(3))
BEGIN
SELECT result AS result计算之前的值;
SET result=i+j;
END //
调用存储过程:SET @result=10;
CALL proc(1, 1, @result); =>10(result计算之前的值)
SELECT @result; =>2
6)
-- IF 语句
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3))
BEGIN
IF i10 THEN SELECT '大于10';
ELSE SELECT '等于10';
END IF;
END //
调用存储过程:CALL proc(8); =>小于10
CALL proc(10); =>等于10
CALL proc(18); =>大于10
7)
-- CASE 语句
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3))
BEGIN
CASE i
WHEN 1 THEN SELECT '星期一';
WHEN 2 THEN SELECT '星期二';
WHEN 3 THEN SELECT '星期三';
WHEN 4 THEN SELECT '星期四';
WHEN 5 THEN SELECT '星期五';
WHEN 6 THEN SELECT '星期六';
WHEN 7 THEN SELECT '星期天';
ELSE SELECT '错误的数据';
END CASE;
END //
调用存储过程:CALL proc(5); =>星期五
8)
-- LOOP 循环
8.1)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3))
BEGIN
DECLARE num INT(3) DEFAULT 10; -- 定义局部变量(循环的次数)
myloop:LOOP -- 定义循环的块名称
IF num>i THEN LEAVE myloop; -- 判断循环次数是否大于传递进来的参数,大于则退出 myloop 循环块
END IF; -- 判断结束
SELECT num; -- 循环没有结束 输出
SET num=num+1; -- 循环变量递增
END LOOP myloop; -- myloop块的结束
END //
调用存储过程:CALL proc(11); =>10
CALL proc(9); =>[SQL]CALL proc(9);受影响的行: 0时间: 0.000s(现在还不是很懂什么意思)
8.2)
DROP PROCEDURE IF EXISTS proc;
DELIMITER //
CREATE PROCEDURE proc(i INT(3))
BEGIN
DECLARE num INT(3) DEFAULT 10; -- 定义局部变量(循环的次数)
myloop:LOOP -- 定义循环的块名称
SELECT num; -- 循环没有结束 输出
SET num=num+1; -- 循环变量递增
IF numi -- 循环的条件(当条件满足则退出循环)
END REPEAT;
END //
调用存储过程:CALL proc(3); =>10(还不太懂)
11)
-- 函数(不能有select语句) 必须定义返回值 在函数体内必须有return语句
DROP FUNCTION IF EXISTS myfun;
DELIMITER //
CREATE FUNCTION myfun(i INT(3)) RETURNS INT(3)
BEGIN
DECLARE mysum INT DEFAULT 0;
DECLARE num INT DEFAULT 1;
WHILE num10
-- 在创建函数时报1418错误
SET GLOBAL log_bin_trust_function_creators=TRUE;
-- mysql中遇到;就开始执行
-- 函数(不能有select语句) 必须定义返回值 在函数体内必须有return语句
DROP FUNCTION IF EXISTS myfun;
DELIMITER //
CREATE FUNCTION myfun(i INT(3)) RETURNS INT(3)
BEGIN
DECLARE mysum INT DEFAULT 0;
DECLARE num INT DEFAULT 1;
WHILE num8