1.1 存储过程和函数概述

存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程和函数的区别在于函数必须有返回值,而存储过程没有。

函数 : 是一个有返回值的过程 ;

过程 : 是一个没有返回值的函数 ;

1.2 创建存储过程

CREATE PROCEDURE procedure_name ([proc_parameter[,...]])begin    -- SQL语句end ;

示例 :

delimiter $​create procedure pro_test1()begin    select 'Hello Mysql' ;end$​delimiter ;

知识小贴士

DELIMITER

该关键字用来声明SQL语句的分隔符 , 告诉 MySQL 解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。

1.3 调用存储过程

call procedure_name() ; 

1.4 查看存储过程

-- 查询db_name数据库中的所有的存储过程select name from mysql.proc where db='db_name';​​-- 查询存储过程的状态信息show procedure status;​​-- 查询某个存储过程的定义show create procedure test.pro_test1 G;

1.5 删除存储过程

DROP PROCEDURE  [IF EXISTS] sp_name ;

1.6 语法

存储过程是可以编程的,意味着可以使用变量,表达式,控制结构 , 来完成比较复杂的功能。

4.6.1 变量
  • DECLARE通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中。
DECLARE var_name[,...] type [DEFAULT value]

示例 :

 delimiter $​ create procedure pro_test2()  begin     declare num int default 5;    select num+ 10;  end$​ delimiter ; 
  • SET

直接赋值使用 SET,可以赋常量或者赋表达式,具体语法如下:

  SET var_name = expr [, var_name = expr] ...

示例 :

  DELIMITER $    CREATE  PROCEDURE pro_test3()  BEGIN    DECLARE NAME VARCHAR(20);    SET NAME = 'MYSQL';    SELECT NAME ;  END$    DELIMITER ;

也可以通过select ... into 方式进行赋值操作 :

DELIMITER $​CREATE  PROCEDURE pro_test5()BEGIN    declare  countnum int;    select count(*) into countnum from city;    select countnum;END$​DELIMITER ;
1.6.2 if条件判断

语法结构 :

if search_condition then statement_list​    [elseif search_condition then statement_list] ...        [else statement_list]    end if;

需求:

根据定义的身高变量,判定当前身高的所属的身材类型 ​    180 及以上 ----------> 身材高挑​    170 - 180  ---------> 标准身材​    170 以下  ----------> 一般身材

示例 :

delimiter $​create procedure pro_test6()begin  declare  height  int  default  175;   declare  description  varchar(50);    if  height >= 180  then    set description = '身材高挑';  elseif height >= 170 and height < 180  then    set description = '标准身材';  else    set description = '一般身材';  end if;    select description ;end$​delimiter ;

调用结果为 :

1.6.3 传递参数

语法格式 :

create procedure procedure_name([in/out/inout] 参数名   参数类型)...​​IN :   该参数可以作为输入,也就是需要调用方传入值 , 默认OUT:   该参数作为输出,也就是该参数可以作为返回值INOUT: 既可以作为输入参数,也可以作为输出参数

IN - 输入

需求 :

根据定义的身高变量,判定当前身高的所属的身材类型 

示例 :

delimiter $​create procedure pro_test5(in height int)begin    declare description varchar(50) default '';  if height >= 180 then    set description='身材高挑';  elseif height >= 170 and height < 180 then    set description='标准身材';  else    set description='一般身材';  end if;  select concat('身高 ', height , '对应的身材类型为:',description);end$​delimiter ;

OUT-输出

需求 :

根据传入的身高变量,获取当前身高的所属的身材类型  

示例:

create procedure pro_test5(in height int , out description varchar(100))begin  if height >= 180 then    set description='身材高挑';  elseif height >= 170 and height < 180 then    set description='标准身材';  else    set description='一般身材';  end if;end$    

调用:

call pro_test5(168, @description)$​select @description$

小知识

@description : 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。

@@global.sort_buffer_size : 这种在变量前加上 "@@" 符号, 叫做 系统变量

1.6.4 case结构

语法结构 :

方式一 : ​CASE case_value​  WHEN when_value THEN statement_list    [WHEN when_value THEN statement_list] ...    [ELSE statement_list]  END CASE;​​方式二 : ​CASE​  WHEN search_condition THEN statement_list    [WHEN search_condition THEN statement_list] ...    [ELSE statement_list]  END CASE;​

需求:

给定一个月份, 然后计算出所在的季度

示例 :

delimiter $​​create procedure pro_test9(month int)begin  declare result varchar(20);  case     when month >= 1 and month <=3 then       set result = '第一季度';    when month >= 4 and month <=6 then       set result = '第二季度';    when month >= 7 and month <=9 then       set result = '第三季度';    when month >= 10 and month <=12 then       set result = '第四季度';  end case;    select concat('您输入的月份为 :', month , ' , 该月份为 : ' , result) as content ;  end$​​delimiter ;
1.6.5 while循环

语法结构:

while search_condition do​    statement_list    end while;

需求:

计算从1加到n的值

示例 :

delimiter $​create procedure pro_test8(n int)begin  declare total int default 0;  declare num int default 1;  while num<=n do    set total = total + num;    set num = num + 1;  end while;  select total;end$​delimiter ;
1.6.6 repeat结构

有条件的循环控制语句, 当满足条件的时候退出循环 。while 是满足条件才执行,repeat 是满足条件就退出循环。

语法结构 :

REPEAT​  statement_list​  UNTIL search_condition​END REPEAT;

需求:

计算从1加到n的值

示例 :

delimiter $​create procedure pro_test10(n int)begin  declare total int default 0;    repeat     set total = total + n;    set n = n - 1;    until n=0    end repeat;    select total ;  end$​​delimiter ;
1.6.7 loop语句

LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE 语句实现,具体语法如下:

[begin_label:] LOOP​  statement_list​END LOOP [end_label]

如果不在 statement_list 中增加退出循环的语句,那么 LOOP 语句可以用来实现简单的死循环。

1.6.8 leave语句

用来从标注的流程构造中退出,通常和 BEGIN ... END 或者循环一起使用。下面是一个使用 LOOP 和 LEAVE 的简单例子 , 退出循环:

delimiter $​CREATE PROCEDURE pro_test11(n int)BEGIN  declare total int default 0;    ins: LOOP        IF n <= 0 then      leave ins;    END IF;        set total = total + n;    set n = n - 1;      END LOOP ins;    select total;END$​delimiter ;
1.6.9 游标/光标

游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下。

声明光标:

DECLARE cursor_name CURSOR FOR select_statement ;

OPEN 光标:

OPEN cursor_name ;

FETCH 光标:

FETCH cursor_name INTO var_name [, var_name] ...

CLOSE 光标:

CLOSE cursor_name ;

示例 :

初始化脚本:

create table emp(  id int(11) not null auto_increment ,  name varchar(50) not null comment '姓名',  age int(11) comment '年龄',  salary int(11) comment '薪水',  primary key(`id`))engine=innodb default charset=utf8 ;​insert into emp(id,name,age,salary) values(null,'金毛狮王',55,3800),(null,'白眉鹰王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800);​
-- 查询emp表中数据, 并逐行获取进行展示create procedure pro_test11()begin  declare e_id int(11);  declare e_name varchar(50);  declare e_age int(11);  declare e_salary int(11);  declare emp_result cursor for select * from emp;    open emp_result;    fetch emp_result into e_id,e_name,e_age,e_salary;  select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为: ',e_salary);    fetch emp_result into e_id,e_name,e_age,e_salary;  select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为: ',e_salary);    fetch emp_result into e_id,e_name,e_age,e_salary;  select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为: ',e_salary);    fetch emp_result into e_id,e_name,e_age,e_salary;  select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为: ',e_salary);    fetch emp_result into e_id,e_name,e_age,e_salary;  select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为: ',e_salary);    close emp_result;end$​

通过循环结构 , 获取游标中的数据 :

DELIMITER $​create procedure pro_test12()begin  DECLARE id int(11);  DECLARE name varchar(50);  DECLARE age int(11);  DECLARE salary int(11);  DECLARE has_data int default 1;    DECLARE emp_result CURSOR FOR select * from emp;  DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;    open emp_result;    repeat    fetch emp_result into id , name , age , salary;    select concat('id为',id, ', name 为' ,name , ', age为 ' ,age , ', 薪水为: ', salary);    until has_data = 0  end repeat;    close emp_result;end$​DELIMITER ; 

1.7 存储函数

语法结构:

CREATE FUNCTION function_name([param type ... ]) RETURNS type BEGIN    ...END;

案例 :

定义一个存储过程, 请求满足条件的总记录数 ;

​delimiter $​create function count_city(countryId int)returns intbegin  declare cnum int ;    select count(*) into cnum from city where country_id = countryId;    return cnum;end$​delimiter ;

调用:

select count_city(1);​select count_city(2);

bat 存储过程返回值_MySQL-存储过程和函数详述相关推荐

  1. mysql c 调用存储过程返回值_Mysql:使用返回值调用存储过程

    我试图使用这个过程: DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_login`( IN in_Email VARCHAR( ...

  2. 存储过程系列之存储过程返回值总结

    sql存储过程返回值总结 1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种 ...

  3. C#获取存储过程返回值和输出参数值的方法

    //转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...

  4. 获取存储过程返回值及代码中获取返回值

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  5. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

    java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...

  6. 获取存储过程返回值及代码中获取返回值(转)

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  7. c oracle存储过程返回值,C#调用存储过程详解(带返回值、参数输入输出等)

    本文实例讲述了C#调用存储过程的方法.分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @stu ...

  8. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

  9. c# mysql存储过程 输出参数值_MySQL 存储过程参数用法 in, out, inout

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  10. mysql存储过程list参数_mysql存储过程教程(1)

    MySQL存储过程 1.1         CREATE  PROCEDURE  (创建) CREATE PROCEDURE存储过程名(参数列表) BEGIN SQL语句代码块 END 注意: 由括号 ...

最新文章

  1. 设置Tomcat字符集为utf-8
  2. sublime开启vim模式
  3. 几款强大的 Pandas 数据探索工具,推荐收藏使用
  4. Lingo计算最优解
  5. 信息学奥赛一本通(1044:判断是否为两位数)
  6. QT 5 1 0 MinGW 的安装及使用
  7. 秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
  8. Java泛型之类型擦除
  9. xp系统远程计算机需要网络打印机驱动,xp系统如何设置网络打印机共享
  10. Python实现键盘操作方法
  11. Airprint across subnets(2)
  12. Keytool命令来生成CA数字证书
  13. 51单片机数码管静态显示
  14. 【AI语音】魔百盒M301H-JL代工-3798MV300芯片-支持蓝牙_免费固件包
  15. 马王堆汉墓帛书‧老子乙本——道经
  16. elasticsearch 分词器器读写分词
  17. PS快速制作流血火焰和冰封字体
  18. Ideas For Weakly Supervised Object Localization
  19. 国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨
  20. C++线程学习4,多线程通信和同步

热门文章

  1. 唐门的竹林伪原创工具
  2. 在mount里看到哪个设备文件的一些笔记
  3. 开始投靠C#,入门版(一)
  4. 结合PE格式对linker分析1
  5. 如何让我的mfc应用程序可以在最上面?
  6. IGDB|2021年大学生夏令营开始报名啦!
  7. Cell子刊:盗梦空间成真,科学家成功进入他人梦境,并与之“交流对话”
  8. 一个10篇一作SCI博士的走心分享----宏组学研究之“道” (完整收藏版)!!
  9. 使用 Finder预览功能,让你可以快速浏览多个文件
  10. js ajax java传参_js使用ajax传值给后台,后台返回字符串处理方法