基本结构
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`$$
CREATE PROCEDURE `test`()
BEGIN
END$$
DELIMITER ;
参数类型
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`$$
CREATE PROCEDURE `test`(
IN inparam INT,
OUT outparam INT,
INOUT inoutparam INT
)
BEGIN
END$$
DELIMITER ;
存储过程参数在过程名的括号里声明
参数类型包括 只读(in),只写(out),可读写(inout)
in 给存储过程传入参数值
out 向调用存储过程的调用者返回数据
inout 可以对传入参数进行修改后再返回给存储过程(比如分页存储过程中当前页的参数应当设置为i inout类型)
变量类型
mysql存储过程中有两种变量类型
1 declare 声明的局部变量(我们这样命名的,这种变量只在过程体begin,end之间才有效)
DECLARE param1 INT DEFAULT 1;
2 带@的全局变量(在整个会话过程中都有效)
DELIMITER $$
DROP PROCEDURE IF EXISTS `testparam`$$
CREATE PROCEDURE `testparam`()
BEGIN
DECLARE param1 INT DEFAULT 1;
SET param1 = param1 +1;
SET @param2 = @param2+1;
SELECT param1,@param2;
END$$
DELIMITER ;
SET @param2 =3;
CALL testparam();
给param2设置一个初始值然后调用存储过程,发现每次param1都是2,param2逐次加1.
上面列子中的set语句是给变量复制,select语句是查询语句,将结果显示在窗口,这点可用在代码调试上,当然实际开发中主要还是使用断点。
条件判断(if,case..when语句)
这是if语句的基本结构
IF expression THEN commands
[ELSEIF expression THEN commands]
[ELSE commands]
END IF;
这是 case when语句的基本结构
CASE case_expression
WHEN when_expression THEN commands
WHEN when_expression THEN commands
...
ELSE commands
END CASE;
注意下最后面有一个匹配的end(Java里面好像没有)
循环语句
有三种 循环语句
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
我们来写一个从1加到50的例子
WHILE……DO……END WHILE 语句,
while语句执行前检查
当i<50时停止循环(while 与 end while 之间的代码块是循环体 也就是退出条件不满足时一直执行 循环体之间的代码块)
DELIMITER $$
DROP PROCEDURE IF EXISTS `testwhile`$$
CREATE PROCEDURE `testwhile`()
BEGIN
DECLARE i INT ;
DECLARE result INT DEFAULT 0;
SET i =1;
WHILE i<50 DO
SET result = result +i;
SET i= i+1;
END WHILE;
SELECT result;
END$$
DELIMITER ;
REPEAT……UNTIL END REPEAT语句
repeat语句先执行完repeate 包含的代码块在判断until后面的语句
直到until后面条件语句成立时退出循环,这种语句至少执行一次repeat代码块里面的语句。
REPEAT
UNTIL repeat_expression
END REPEAT;
上面的从1加到50的例子用 REPEAT……UNTIL END REPEAT语句就是这样的了(repeat 与 end repeat 之间的代码块是循环体 也就是退出条件不满足时一直执行 循环体之间的代码块)
DELIMITER $$
DROP PROCEDURE IF EXISTS `testwhile`$$
CREATE PROCEDURE `testwhile`()
BEGIN
DECLARE i INT ;
DECLARE result INT DEFAULT 0;
SET i =1;
REPEAT
SET result = result +i;
SET i=i+1;
UNTIL i>=50
END REPEAT;
SELECT result;
END$$
LOOP……END LOOP 语句(loop 与 end loop 之间的代码块是循环体 也就是退出条件不满足时一直执行 循环体之间的代码块)
DELIMITER $$
DROP PROCEDURE IF EXISTS `testwhile`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `testwhile`()
BEGIN
DECLARE i INT ;
DECLARE result INT DEFAULT 0;
SET i =1;
loop_while:LOOP
SET result = result + i;
SET i= i+1;
IF i>=50 THEN
LEAVE loop_while;
END IF;
END LOOP;
SELECT result;
END$$
DELIMITER ;