一、过程与函数简介

  过程与函数是命名的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调用

最新文章

  1. Could not load file or assembly &#39;System.ServiceModel.DomainServices.Hosting&#39;.系统找不到指定文件
  2. sprintf()函数的用法
  3. 2014-10-2 bug更新5 ecshop和ectouch解决动态ip登录超时和购物车清空问题
  4. 使 Excel 规则更容易理解(Oracle Policy Modeling-Make your Excel rules easier to understand)
  5. manifest package
  6. Python标准库10 多进程初步 (multiprocessing包)
  7. git(osx)上的一个git commit无法正确提交的问题
  8. libjingle线程机制
  9. 响应式布局中重要的meta标签设置.适用于手机浏览器兼容性设置
  10. 杭电ACM水仙花数
  11. iosclient暑期“动画屋“活动项目总结
  12. 《JavaScript高级程序设计》读书笔记 ---变量
  13. python 之变量
  14. C实战:项目构建Make,Automake,CMake
  15. linux打包压缩常用命令
  16. 自定义JDBC链接池
  17. nginx1.14.0下载、安装、启动
  18. 存在Settings数据在手机系统中的位置
  19. Mysql 单表查询 子查询 关联查询
  20. 深度学习python的配置(Windows)

热门文章

  1. Eclipse Maven 创建Hello World Web项目
  2. 20130907.Git学习记录
  3. Mysql学习总结(34)——Mysql 彻底解决中文乱码的问题
  4. IBASE4J开发环境搭建
  5. IE6浏览器不支持固定定位(position:fixed)解决方案(转)
  6. WinServer-AD域控入门
  7. jquery mobile常用的data-role类型介绍
  8. EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)
  9. [CSS3] The picture element
  10. javase复习