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调用
最新文章
- Could not load file or assembly &#39;System.ServiceModel.DomainServices.Hosting&#39;.系统找不到指定文件
- sprintf()函数的用法
- 2014-10-2 bug更新5 ecshop和ectouch解决动态ip登录超时和购物车清空问题
- 使 Excel 规则更容易理解(Oracle Policy Modeling-Make your Excel rules easier to understand)
- manifest package
- Python标准库10 多进程初步 (multiprocessing包)
- git(osx)上的一个git commit无法正确提交的问题
- libjingle线程机制
- 响应式布局中重要的meta标签设置.适用于手机浏览器兼容性设置
- 杭电ACM水仙花数
- iosclient暑期“动画屋“活动项目总结
- 《JavaScript高级程序设计》读书笔记 ---变量
- python 之变量
- C实战:项目构建Make,Automake,CMake
- linux打包压缩常用命令
- 自定义JDBC链接池
- nginx1.14.0下载、安装、启动
- 存在Settings数据在手机系统中的位置
- Mysql 单表查询 子查询 关联查询
- 深度学习python的配置(Windows)
热门文章
- Eclipse Maven 创建Hello World Web项目
- 20130907.Git学习记录
- Mysql学习总结(34)——Mysql 彻底解决中文乱码的问题
- IBASE4J开发环境搭建
- IE6浏览器不支持固定定位(position:fixed)解决方案(转)
- WinServer-AD域控入门
- jquery mobile常用的data-role类型介绍
- EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)
- [CSS3] The picture element
- javase复习