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调用