mysql-过程与函数
一、过程与函数简介
过程与函数是命名的PL/SQL块(也是用户的方案对象),被编译后存储在数据库中,以备执行。因此,其他PL/SQL块可以按名称来使用他们。所以可以将商业逻辑、企业规划写成函数或过程保存到数据库中,以便共享。
过程和函数统称为PL/SQL子程序,他们是被命名的PL、SQL块,均存储在数据库中,并通过输入、输出参数或输入、输出参数与调用者交换信息。
过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据。
二、存储简介
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合,可见其视为批文件。
使用存储过程的原因:
1、通过把处理封装在容易使用的单元中,简化复杂的操作。
2、由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码相同。
3、简化对变动的管理,如果表名、列名业务逻辑有变化,只需要更改存储过程的代码,使用它的人员甚至不需要知道这些变化。
4、提高性能。使用存储过程比使用单独的sql语句要快
5、存储过程的使用可以使编写代码更灵活。
使用存储过程三个好处:简单、安全、高性能
三、存储过程概述
注:
(1)、DELIMITER和//DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以‘;’为分隔符,如果我们没有声明分隔符,那么编译器会把存储过程当成sql语句进行处理,则存储过程的编译过程会报错,所以要实现用DELIMITER关键字申明当前段分隔符,这样Mysql才会将;当做存储过程中的代码,不会这行这些代码,用完了之后要将分隔符还原。
(2)、存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型为int,如果有多个参数用“,”隔开。
(3)、过程体的开始和结束用begin和end进行标识。
(4)、后面的delimiter必须空格之后才能加分号
四、MySQL存储过程参数IN、OUT
mysql存储过程的参数用在存储过程的定义,共有三中参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN|OUT|INOUT] 参数名 数据类型...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。
OUT 输出参数:该值可以在存储过程内部被改变并返回
INOUT输入输出参数:调用时指定,并且可被改变和返回
存储过程 p_1:
drop procedure if exists p_1;
delimiter //
create procedure p_1(
in_num int,
in_flag bool,
in_rate float(10,2),
out out_sum float(10,2)
)
begin
set @sum:=0;
select sum(item_price*quantity) into @sum
from orderitems o
where order_num=in_num;
if in_flag then
set @sum:=@sum*in_rate+@sum;
end if;
set out_sum:=@sum; end //
delimiter ;
调用p_1:
set @out:=0;
call p_1(20006,1,0.1,@out);
select @out;
五、存储过程的各种操作
1、mysql存储过程调用
用call和过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。
2、mysql存储过程的修改
ALTER PROCEDURE
更改用CREATE PROCEDURE建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。
3、mysql存储过程的删除
删除一个存储过程比较简单,和删除表一样;
drop procedure;
从mysql的表格中删除一个或多个存储过程。
六、存储过程的控制语句
1、if-then-else
if(expr1,expr2,expr3):expr1为真,则返回expr2,否则返回expr3
select
if(vend_id>1002,'质量好','质量差'),vend_id
from products;
ifnull(expr1,expr2):expr1为空,则返回expr2,否则返回expr1
select
ifnull (cust_email,'邮箱为空') ,cust_email
from customers;
nullif(expr1,expr2):如果expr1和expr2相等,返回空,否则返回expr1.
select
nullif (1,1)
2、case语句
两种case方法:第一种限定了case的字段,改变字段的值来when不同的情况
第二种不限定case的字段,when的时候加上不同的字段,来when不同字段
第一种:
select f_name,
case f_name
when 'JACK' then '帅'
when 'JOHN' then '衰'
end 说明
from father;*/
第二种:
select f_name,
case
when f_name='JACK' then '帅'
when f_name='JOHN' then '衰'
end 说明
from father;
3、while...end while
过程:
drop procedure if exists p_2;
delimiter //
create procedure p_2(
)
begin
set @i:=0;
while @i<10 do
select @i;
set @i:=@i+1;
end while;
end //
delimiter ;
调用
call p_2();
4、repeat... end repeat: (相当于do while)
drop procedure if exists p_3;
delimiter //
create procedure p_3(
)
begin
set @i:=0;
repeat
select @i;
set @i=@i+1;
until @i>9
end repeat;
end //
delimiter ;
call p_3();
5、loop......end loop
loop循环不需要初始条件,这点和while循环相似,同时和repeat循环一样不需要结束条件,leave语句的意义是离开循环
drop procedure if exists p_4;
delimiter //
create procedure p_4(
)
begin
set @i:=0;
loop1:loop
select @i;
set @i=@i+1;
if @i>9 then
leave loop1;
end if;
end loop;
end //
delimiter ;
call p_4();
六、MYSQL函数
select f_1(0.1)
drop function if exists f_1;
delimiter //
create function f_1(
in_rate float(10,2)
)returns float(10,2)
begin
set @sum:=0;
select sum(item_price*quantity)*in_rate into @sum
from orderitems;
return @sum;
end //
delimiter ;
删除函数:drop function 函数名
七、函数和过程的区别
1、函数没有out参数,它通过returns进行返回;过程有out参数
2、函数需要通过select调用,过程通过call调用
mysql-过程与函数的更多相关文章
- mysql 过程和函数语法学习笔记
CREATE DEFINER=`root`@`%` PROCEDURE `test`(`num` int) BEGIN /*定义变量*/ DECLARE sex TINYINT(2) DEFAULT ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- 演示Java如何调用Mysql的过程和函数
这里只演示Java如何调用Mysql的过程和函数 --------------------------------------------------------------------------- ...
- mysql创建自定义函数与存储过程
mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...
- mysql日期时间函数2
win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而工作中有的时候每周是从周六开始算的,有些数据需要按周统计,那么那种方式比较好呢? 通过下面的研究 ...
- mysql存储过程、函数和触发器的创建 [转]
http://blog.itpub.net/559237/viewspace-438942/ 今天花了半天时间来研究mysql的存储过程函数和触发器的创建,觉得和oracle的大同小异,只是语法上更艰 ...
- mysql编程--创建函数出错的解决方案
本文章转载自:http://www.jb51.net/article/71100.htm 在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题 ...
- navicat与phpmyadmin做mysql的自定义函数和事件
自定义函数和事件是mysql一个很方便的功能,navicat在5.1以上版本就支持了自定义函数和事件,phpmyadmim不清楚. 用这个是由于一些简单的事情,没有必要去做一个服务器计划使用 接下来我 ...
- MySQL中时间函数NOW()和SYSDATE()的区别
mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...
- mysql中的函数与存储过程
mysql中的函数:1 mysql下创建函数: 1.1 语法: delimiter $$ -- 设置分隔符,默认是; 设置成其他符号,让编译器知道我们函数编写的结束,此处设置成$$ create fu ...
随机推荐
- BlogEngine.NET架构学习:Extension扩展实现
之前有个系列文章介绍过BlogEngine.NET,其中也有关于插件的介绍:"BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)--Extension与管理上的实现& ...
- mysql存储小数
线下不知道什么版本的古董了,经本人亲测,varchar类型的数据,可以直接执行mysql的sum函数. ________________________________________________ ...
- 【codeforces 746G】New Roads
[题目链接]:http://codeforces.com/problemset/problem/746/G [题意] 给你3个数字n,t,k; 分别表示一棵树有n个点; 这棵树的深度t,以及叶子节点的 ...
- MyBatis学习总结(7)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- linux 文件的权限说明
1.开头 d:表示问文件夹 ( directory ) -:表示普通二进制文件 ( 压缩包.文件 等等 ) l:表示软连接文件 ( link 硬链接或软链接 ) 2.权限 ( 3 个为一组 ) r:读 ...
- IntelliJ IDEA启动spring boot项目出现Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
IntelliJ IDEA启动spring boot项目出现Failed to start component [StandardEngine[Tomcat].StandardHost[localho ...
- cocos2dx-3.0创建Android项目时遇到的错误。
cocos run -p android出现 文件名称.文件夹名或卷标语法不对 Updated project.properties Updated local.properties Updated ...
- 51nod-1359: 循环探求
[传送门:51nod-1359] 简要题意: 给出n和k,求出最小的x满足$n^{x}≡n(mod\;10^{k})$ 题解: 真是一道有(du)趣(liu)题目 首先我们设X[k-1]为$n^{x} ...
- Wireshark filter语法
过滤器语法 ------------------------------------------------------------- 最简单的过滤允许你检查一个协议或者字段的存在.如果你想查看所有的 ...
- Windows窗体应用布局详解
上回我们已经会用基本的控件创建Windows窗体应用,这才我们再来认识一些高级控件并使用ADO.NET技术连接数据库来创建功能更坚强大的窗体应用! 菜单栏控件MenuStrip .NET中提供了一个M ...