MySQL基础(5) | 存储过程


一、基础

  1. 结束符【重要】

mysql的命令行执行每一条命令是以分号结尾的,也就是说识别是否为一条命令,是根据分号决定的。

然而存储过程中设计多条语句,很可能出现多个分号,所以直接把存储过程复制到命令执行一般都会失败。

解决方法是临时切换分隔符,让命令行知道整个存储过程的代码是完整的一块代码,如下:

DELIMITER $$
BEGIN
select * from table_name;
END$$
  1. 声明存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)
  1. 存储过程开始和结束符号
BEGIN .... END
  1. 变量赋值【注:使用Set可以直接创建并赋值一个变量,该变量要用@开头】
SET @p_in=1;
SELECT 'Hello World' into @x;
  1. 变量定义【注:DECLARE定义的变量,开头不能加@,也是比较坑】
DECLARE l_int int unsigned default 4000000;
  1. 存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
  1. 注释
#注释方式一
-- 注释方式二【注意有空格】
/*
注释方式三【可以注释多行】
*/

二、进阶

1). 条件语句

  1. if---then---else---end if 语句
delimiter $$
create PROCEDURE proc(aa int)
begin
declare sum int;
set sum = 100;
if aa > 0 then
set sum = sum - aa;
else
set sum = sum + aa;
end if;
select sum;
end$$
  1. case---when---then---else---end case语句
delimiter //
CREATE PROCEDURE proc2 ( aa INT ) BEGIN
DECLARE sum INT;
SET sum = 100;
CASE aa
WHEN 0 THEN
SET sum = sum + 10;
WHEN 1 THEN
SET sum = sum + 11;
ELSE
SET sum = sum + 12;
END CASE;
SELECT sum;
END //

2). 循环语句

  1. while---do---end while语句
delimiter //
CREATE PROCEDURE proc3(a int)
BEGIN
set @result = a;
WHILE a > 0 DO
set @result = @result + a;
set a = a - 1;
END WHILE;
select @result;
END // call proc3(100)
  1. repeat---until 结束条件 end repeat;
delimiter //
CREATE PROCEDURE proc4(aa int)
BEGIN
declare result int;
set result = 0; REPEAT
set result = result + aa;
set aa = aa - 1;
UNTIL aa <= 0 END REPEAT; SELECT result;
END // CALL proc4(3)
  1. loop语句
label: LOOP
statement_list IF exit_condition THEN
LEAVE label;
END IF;
END LOOP label;
delimiter //
CREATE PROCEDURE proc5(aa int)
BEGIN
declare result int;
set result = 0; label: LOOP
set result = result + aa;
set aa = aa - 1; IF aa <= 0 THEN
LEAVE label;
END IF;
END LOOP label; SELECT result;
END //
  1. iterate迭代【复合】
delimiter //
CREATE PROCEDURE proc6(aa int, out result int)
BEGIN
set result = 0;
label: LOOP
#如果aa是偶数,则跳过
if aa % 2 = 0 then
set aa = aa - 1;
ITERATE label;
end if; set result = result + aa;
set aa = aa - 1; IF aa <= 0 THEN
LEAVE label;
END IF;
END LOOP label; SELECT result;
END // call proc6(3, @result);
SELECT @result;

最新文章

  1. eclipse 搭建python环境
  2. 基于Python的函数回归算法验证
  3. cf(#div1 A. Dreamoon and Sums)(数论)
  4. WordPress 4.0 “Benny” 正式发布
  5. 创投女王徐新:如何迅速做到细分市场第一(FW)
  6. 02-线性结构2 Reversing Linked List
  7. 先声明再定义的必要性 .xml
  8. 使用Teleport Pro离线下载网页所有内容
  9. 转:按需加载html 图片 css js
  10. 【转】windows 7系统安装与配置Tomcat服务器环境
  11. Android服务开发经验——优雅地活着
  12. SiteMesh入门(1-1)SiteMesh是什么?
  13. chrome下positon:fixed无效或抖动的解决办法
  14. iomanip的作用 C++
  15. 解决AJAX session跨域失效
  16. mysql存储过程变量的拼接
  17. [leetcode]Set Matrix Zeroes @ Python
  18. JMM和底层实现原理
  19. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
  20. [ActionScript 3.0] 使用Embed在类中嵌入字体

热门文章

  1. CSS-04-层叠选择器
  2. Ubuntu通过终端命令行换阿里源
  3. docker挂载war包到tomcat容器中的注意点和坑
  4. 在python3 encode和decode 的使用
  5. Spring 核心功能演示
  6. Android 开启与关闭软键盘
  7. python 类 --导入类
  8. PTA 7-9 集合相似度(STL之set初体验)
  9. java13人机猜拳
  10. 关于在osgearth 中 出现 arial.ttf : file not handled 的问题