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 ...
随机推荐
- hbase的hbase-site.xml配置文件
<property> <name>hbase.rootdir</name> <value>hdfs://server110/hbase</valu ...
- 集合接口list与集合接口set的区别
在Java中 除了 Map以外的集合的根接口都是Collection接口,而在Collection接口的子接口中,最重要的莫过于List和Set集合接口. 今天我们就来谈谈List集合接口与Set集合 ...
- DML语句(添加、更新和删除记录)
a.添加记录(一次插入一行记录) insert into 表名(字段名,字段名...) values (字段值,字段值...) insert into person ...
- HTML5与后台服务器的数据流动问题
编辑中,尚未完稿...2017.7.14 1345 很多前端开发出来的HTML5可能对于后台开发者来说,并不是很清楚,也许像我一样一知半解.而且真的让人很糊涂的地方就是前端的JS如何与后端的数据库进行 ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
- 关于Segmentation fault错误
今天敲代码时候出现了Segmentation fault,在网上查了一些资料,基本上的原因是.非法的内存訪问. 比如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法 ...
- 模式匹配的KMP 算法
常见的字符串匹配时,模式串长度为n,源串长度为m,则从头匹配,两个指针i指向源串,j指向模式串,如遇到不同则回溯使j=0,这样就要反复匹配会使效率变低. 因为在如今i之前 的模式串与匹配串的匹配是同样 ...
- 使用Powershell 的获取别的机器WMI类失败解决方法!
有些时候须要连接多台机器去获取他们的类,可是有些时候我们发现计算机无法连接,这个时候怎么办呢? 请改动组策略中下面配置: 能够使用Gpmc.msc 进行以后.本地计算机策略--计算机配置--管理模板- ...
- poj_1952最大下降子序列,统计个数
其实不算难的一道题,但憋了我好久,嗯,很爽. #include<iostream> #include<cstdio> #include<string.h> #inc ...
- POJ 3693 后缀数组+RMQ
思路: 论文题 后缀数组&RMQ 有一些题解写得很繁 //By SiriusRen #include <cmath> #include <cstdio> #includ ...