mysql存储例程、存储过程、存储函数进阶学习(不断更新)(提供word版下载)
时间:2008-07-04
来源:互联网
更多请关注:www.xqbar.com
什么是存储例程?
存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。为什么要使用存储过程?
我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不易维护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。
存储过程(stored procedure)、存储例程(store routine)、存储函数区别
Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。
其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一个结果。
创建存储过程、存储函数
create procedure 存储过程名(参数)
存储过程体
create function 存储函数名(参数)
存储函数体
假设现在有一个数据库omcmc中的表db_info 表结构如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for db_news
-- ----------------------------
DROP TABLE IF EXISTS `db_news`;
CREATE TABLE `db_news` (
`id` int(10) NOT NULL auto_increment,
`title` varchar(200) NOT NULL,
`editor` varchar(20) default NULL,
`origin` varchar(20) default NULL,
`tags` varchar(200) default NULL,
`content` text NOT NULL,
`hits` int(10) default '0',
`ip` varchar(15) NOT NULL,
`time` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `db_news` VALUES ('1', First App', 'xqbar.com', 'xqbar.com', 'omcmc', 'detail。。', '100', '127.0.0.1', '1215051225');
sql包
[attach]***[/attach]
使用上面的表我们创建一个简单的存储过程
create procedure select_news()
select title,hits from db_news;
在终端运行并调用
从上面的截图我们看到如何调用我们的存储过程
调用存储过程
call 存储过程名();
以上我们创建了一个简单的存储过程,当然我们的应用程序不可能使用这么简单的存储过程,我们需要的是能给存储过程传递参数,以返回给我们所需要的结果数据。下面就了解下存储过程的参数。
存储过程的参数
通常存储过程接受用户的参数,返回结果给调用用户。
mysql规定对于存储过程的参数要求其每个参数都必须声明其参数名,数据类型以及该参数是输入参数还是用于返回信息还是两者兼有,对于存储函数php只支持输入参数。
声明参数时规定要使用关键字IN,OUT,INOUT。
其中:
IN:用于输入参数
OUT:用于返回参数
INOUT:用于向存储过程传递参数值,如果该值改变则返回
另外规定对于声名为OUT,INOUT的参数当我们调用存储过程时需要在参数名前加@,以确保参数在过程外调用,下面我们修改上面的存储过程以传递信息编号给存储过程select_news,返回对应的信息标题给我们查看。
drop procedure if exists select_news;
create procedure select_news(IN id int,OUT title varchar(200))
select db_news.title from db_news where db_news.id=id;
在终端运行并调用
注意调用格式
call select_news(1,@title);
其中1是我们要传入的信息编号,title是要返回的对应信息编号标题,由于是OUT所以再调用时要在其前加@在过程外调用。(见下例)
drop procedure if exists getNum;
create procedure getNum(OUT num int)
select 100 into num;
call getNum(@num);
select @num;
截图:
更新:
接着上篇文章,再调用有返回值时上个例子我们可以使用以下的方法调用存储过程:
select @返回参数;
我们现在使用这个方法来调用上面我们创建的select_news,来看看
有人会疑问为什么返回的title是null,而不是像call select_news(1,@title)一样返回的是我们数据库编号对应的数据First App,这是由于我们的存储过程体并没有给title返回参数返回值。
下面我们来看看存储函数
仍然以db_news表为例说明,不过我们在这个存储函数中我们加入其他一些关于存储例程的知识来引入我们这次要谈及的学习对象。
drop function if exists count_news;
delimiter //
create function count_news(hits int) returns int
comment '根据传入的点击次数统计超过此点击数的信息数目'
begin
declare total_news int;
declare hits_num int default 0;
if hits>=0 then
set hits_num=hits;
select count(id) into total_news from db_news where db_news.hits>hits_num;
else
set total_news=0;
end if;
return total_news;
end;
//
delimiter ;
在上面的存储函数中我们使用到了存储例程变量的声明、设置其值、判断语句、存储函数特有的返回值类型及存储例程如何描述(comment).
与存储过程返回参数不同的是存储函数在定义时没用直接声明哪个变量是返回参数,而只是使用了returns声明了返回参数所属的数据类型,返回参数是在函数体中使用return返回要返回的数据变量的形式来表示的。这就需要注意的是:
存储函数只支持输入参数,并且输入参数前没有IN或INOUT.
返回上面的存储函数,我们来解释下代码含义:
drop function if exists count_news;
如果存在存储函数count_news则删除该存储函数,与存储过程一样我们可以使用下面的语句删除存储过程或函数
drop procedure|function [if exists] 存储过程名|存储函数名;
delimiter //
使用delimiter更改mysql默认使用分号(;)使用新的结束符号来结束当前语句,使用delimiter后原先默认的分号(;)结束语句符号不再起作用,直到重新恢复声明结束符后。
create function count_news(hits int) returns int
注意存储函数的参数只有输入参数并且前不再声明IN或INOUT,返回只需声明要返回的数据类型
comment '根据传入的点击次数统计超过此点击数的信息数目'
使用comment 来描述该存储过程或存储函数的功能信息。使用格式为 comment '描述字符串 '
begin
使用begin限定一个处理模块
declare total_news int;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
declare hits_num int default 0;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
if hits>=0 then
set hits_num=hits;
使用set 给变量赋值
select count(id) into total_news from db_news where db_news.hits>hits_num;
sql语句可以使用into给变量赋值
else
set total_news=0;
end if;
上面是一个判断语句,注意格式为if-else-end if 或者 if �Celse if-else-end if
注意分号(;)
return total_news;
使用return 返回存储函数要返回的值,注意该值只能是一个值。
end;
//
delimiter ;
综合一下我们上面的概念知识:
1. 存储函数的参数与存储过程有何不同。
2. 在存储例程中如何更改mysql的默认结束符号。
3. 在存储例程中如何描述功能信息。
4. 声明、设置变量。
5. begin-end语句块。
6. 条件判断if-else if-else-end if 或if-else-end if 或者if-end if
[ 本帖最后由 omcmc 于 2008-7-24 08:21 编辑 ]
作者: omcmc 发布时间: 2008-07-04
作者: PHPChina 发布时间: 2008-07-04

作者: saku87 发布时间: 2008-07-04

作者: coder2008 发布时间: 2008-07-04
作者: luzhou 发布时间: 2008-07-07
作者: seacoastboy 发布时间: 2008-07-07
作者: xjpa7p2 发布时间: 2008-07-07
作者: li_kun1 发布时间: 2008-07-08
作者: hojust 发布时间: 2008-07-08
一般在出报表,或有多表数据更新的时候用。
作者: cchaha 发布时间: 2008-07-08

作者: devotedsky 发布时间: 2008-07-08
作者: 小星 发布时间: 2008-07-08

作者: 海洋天使 发布时间: 2008-07-08
作者: airwin 发布时间: 2008-07-08
作者: bawbaw 发布时间: 2008-07-08

作者: ccy034106 发布时间: 2008-07-09

作者: luzhou 发布时间: 2008-07-09
作者: bush 发布时间: 2008-07-10
作者: xilo 发布时间: 2008-07-10
作者: 寂寞天涯 发布时间: 2008-07-11
作者: G大调巴哈 发布时间: 2008-07-11
作者: 636826 发布时间: 2008-07-11

作者: Cr@zyTreE 发布时间: 2008-07-12
作者: 渔洋童话 发布时间: 2008-07-12
作者: billyyang 发布时间: 2008-07-12

作者: zhujbing 发布时间: 2008-07-14

作者: leehui1983 发布时间: 2008-07-15
作者: index 发布时间: 2008-07-15
作者: hoday 发布时间: 2008-07-15

作者: jiedushi 发布时间: 2008-07-16
作者: xlight 发布时间: 2008-07-16
作者: zhengdl126 发布时间: 2008-07-16
作者: 105644107 发布时间: 2008-07-16

作者: idc365 发布时间: 2008-07-16
作者: 大胃 发布时间: 2008-07-16
作者: yt 发布时间: 2008-07-16
作者: rzjdkj 发布时间: 2008-07-17
作者: xcgh 发布时间: 2008-07-20
作者: 天下有雪 发布时间: 2008-07-21
作者: jingyun 发布时间: 2008-07-21

作者: onesec 发布时间: 2008-07-21
作者: Zerolone 发布时间: 2008-07-21
作者: senciya 发布时间: 2008-07-21

作者: zhangyueru 发布时间: 2008-07-21
一般在出报表,或有多表数据更新的时候用。
作者: stylecn 发布时间: 2008-07-21
作者: winshuan 发布时间: 2008-07-22
作者: analyzer 发布时间: 2008-07-22
顶
作者: swin.wang 发布时间: 2008-07-22
作者: swin.wang 发布时间: 2008-07-22
作者: tqyb 发布时间: 2008-07-23
作者: lshfong 发布时间: 2008-07-23
作者: gvtbs 发布时间: 2008-07-23
作者: littlehehe 发布时间: 2008-07-25
作者: lzwomen 发布时间: 2008-07-25
作者: EricHoo 发布时间: 2008-07-25
作者: bl5749 发布时间: 2008-07-25
作者: wtguang 发布时间: 2008-07-25
作者: sindtoto 发布时间: 2008-07-26
作者: phpcaicai 发布时间: 2008-07-26
作者: phua 发布时间: 2008-07-26
作者: 秒杀 发布时间: 2008-07-26
作者: 哈出出 发布时间: 2008-07-26

作者: 7717060 发布时间: 2008-07-26
一般在出报表,或有多表数据更新的时候用。
作者: shanji 发布时间: 2008-07-26

作者: fly1983 发布时间: 2008-07-26
作者: haodong0616 发布时间: 2008-07-26
作者: benben3221987 发布时间: 2008-07-26

作者: fyland 发布时间: 2008-07-27
作者: PHPnew 发布时间: 2008-07-29
作者: admin2008 发布时间: 2008-07-29
作者: bonacc 发布时间: 2008-07-29

作者: myos 发布时间: 2008-07-29
作者: deeka 发布时间: 2008-07-30
作者: PlaneV 发布时间: 2008-07-30
作者: abiao133 发布时间: 2008-07-30
作者: quanhaier 发布时间: 2008-07-30
作者: frankeyi 发布时间: 2008-07-31
作者: kzy_84 发布时间: 2008-07-31
作者: lxydyx 发布时间: 2008-08-01
作者: sison 发布时间: 2008-08-01
作者: cfw2005 发布时间: 2008-08-01

学习了...
作者: cn413 发布时间: 2008-08-04
作者: jsrgqinbin 发布时间: 2008-08-04




作者: richardhc 发布时间: 2008-08-06
作者: yiguopan 发布时间: 2008-08-07
作者: mitch 发布时间: 2008-08-07
作者: qishengwang 发布时间: 2008-08-08
作者: ycl_jay 发布时间: 2008-08-08
作者: ldshun 发布时间: 2008-08-08
作者: dick571 发布时间: 2008-08-09
作者: scckfzx 发布时间: 2008-08-09
作者: vlijunbo 发布时间: 2008-08-09
作者: hotbone 发布时间: 2008-08-10
作者: tdweb 发布时间: 2008-08-10
作者: 小竣 发布时间: 2008-08-10

作者: huai00 发布时间: 2008-08-10



作者: 34174988 发布时间: 2008-08-11
作者: pxsnow 发布时间: 2008-08-11
作者: 小树叶子 发布时间: 2008-08-11
作者: doltter 发布时间: 2008-08-11


作者: joj_79 发布时间: 2008-08-11

作者: koni 发布时间: 2008-08-11

作者: CrossMaya 发布时间: 2008-08-12


作者: xsir317 发布时间: 2008-08-12
一般在出报表,或有多表数据更新的时候用。
作者: suihr 发布时间: 2008-08-13
作者: xinzf 发布时间: 2008-08-14
作者: adaiwang 发布时间: 2008-08-14
作者: Mpower 发布时间: 2008-08-14
作者: enigma1223 发布时间: 2008-08-15

作者: chchenha 发布时间: 2008-08-15

作者: 一条尸体 发布时间: 2008-08-15
作者: hylhl 发布时间: 2008-08-15
作者: numsix 发布时间: 2008-08-15
作者: dwp34998 发布时间: 2008-08-15

作者: evarainy 发布时间: 2008-08-20
作者: xiaoxiao0503 发布时间: 2008-08-20

作者: lzrabbit 发布时间: 2008-08-20
作者: zooro 发布时间: 2008-08-21
作者: lin_chaoqi 发布时间: 2008-08-21
作者: hoxiao 发布时间: 2009-01-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28