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 ...
随机推荐
- 【hihocoder 1519】 逃离迷宫II
[题目链接]:http://hihocoder.com/problemset/problem/1519?sid=1098756 [题意] Chinese [题解] bfs题; 根据bfs的性质; 第一 ...
- fensorflow 安装报错 DEPENDENCY ERROR
1.错误信息 DEPENDENCY ERROR The target you are trying to run requires an OpenSSL implementation. Your sy ...
- Nutch2 WebPage写入数据库的过程分析
版本: Nutch 2.2.1 本文通过InjectJob来追踪webpage的定义.创建.传递.序列化.写入数据库的整个过程.从源码中摘录了重要的代码行,并标明其所在文件名.行号. 1. 定义 sc ...
- WinServer-IIS-SEO优化
来自为知笔记(Wiz)
- window8.1 CenterOS 双系统
window8.1 CenterOS 双系统 学习了: http://blog.csdn.net/ac_hell/article/details/53436890 https://jingyan.ba ...
- [Javascirpt] Developer-friendly Flow Charts with flowchart.js
Flowchart.js is a great tool for creating quick, simple flowcharts in a way that keeps you out of a ...
- ACM-ICPC Dhaka Regional 2012 题解
B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...
- 百度分页效果之纯jsp版
数据库连接工具类 package com.gao.page.utils; import java.sql.Connection; import java.sql.DriverManager; publ ...
- CCFlow的excel数据源导入Dtl明细表的操作方法以及模版demo
CCBPM支持通过excel向Dtl明细表(从表)导入数据. 以下,我们以cc的財务报销单demo流程解说详细的操作步骤和模版设计. 导入的操纵步骤: 1.流程发起后,在開始节点导入数据源,点击明细表 ...
- 【跟我一步一步学Struts2】——拦截器
前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素 ...