bat 存储过程返回值_MySQL-存储过程和函数详述
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_conditionEND 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_listEND 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-存储过程和函数详述相关推荐
- mysql c 调用存储过程返回值_Mysql:使用返回值调用存储过程
我试图使用这个过程: DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_login`( IN in_Email VARCHAR( ...
- 存储过程系列之存储过程返回值总结
sql存储过程返回值总结 1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种 ...
- C#获取存储过程返回值和输出参数值的方法
//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...
- 获取存储过程返回值及代码中获取返回值
获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...
- oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...
- 获取存储过程返回值及代码中获取返回值(转)
获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...
- c oracle存储过程返回值,C#调用存储过程详解(带返回值、参数输入输出等)
本文实例讲述了C#调用存储过程的方法.分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @stu ...
- mysql 存储过程 定义数组_MySql存储过程
Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...
- c# mysql存储过程 输出参数值_MySQL 存储过程参数用法 in, out, inout
MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...
- mysql存储过程list参数_mysql存储过程教程(1)
MySQL存储过程 1.1 CREATE PROCEDURE (创建) CREATE PROCEDURE存储过程名(参数列表) BEGIN SQL语句代码块 END 注意: 由括号 ...
最新文章
- 设置Tomcat字符集为utf-8
- sublime开启vim模式
- 几款强大的 Pandas 数据探索工具,推荐收藏使用
- Lingo计算最优解
- 信息学奥赛一本通(1044:判断是否为两位数)
- QT 5 1 0 MinGW 的安装及使用
- 秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
- Java泛型之类型擦除
- xp系统远程计算机需要网络打印机驱动,xp系统如何设置网络打印机共享
- Python实现键盘操作方法
- Airprint across subnets(2)
- Keytool命令来生成CA数字证书
- 51单片机数码管静态显示
- 【AI语音】魔百盒M301H-JL代工-3798MV300芯片-支持蓝牙_免费固件包
- 马王堆汉墓帛书‧老子乙本——道经
- elasticsearch 分词器器读写分词
- PS快速制作流血火焰和冰封字体
- Ideas For Weakly Supervised Object Localization
- 国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨
- C++线程学习4,多线程通信和同步
热门文章
- 唐门的竹林伪原创工具
- 在mount里看到哪个设备文件的一些笔记
- 开始投靠C#,入门版(一)
- 结合PE格式对linker分析1
- 如何让我的mfc应用程序可以在最上面?
- IGDB|2021年大学生夏令营开始报名啦!
- Cell子刊:盗梦空间成真,科学家成功进入他人梦境,并与之“交流对话”
- 一个10篇一作SCI博士的走心分享----宏组学研究之“道” (完整收藏版)!!
- 使用 Finder预览功能,让你可以快速浏览多个文件
- js ajax java传参_js使用ajax传值给后台,后台返回字符串处理方法