0

0

php存储例程、存储过程入门教程

php中文网

php中文网

发布时间:2016-05-25 16:57:45

|

1666人浏览过

|

来源于php中文网

原创

什么是存储例程?

存储例程是存储在数据库教程服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。

为什么要使用存储过程?

我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不易维护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。

存储过程(stored procedure)、存储例程(store routine)、存储函数区别

立即学习PHP免费学习笔记(深入)”;

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');

使用上面的表我们创建一个简单的存储过程

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; 

php存储例程、存储过程进阶学习之二

接着上篇文章,再调用有返回值时上个例子我们可以使用以下的方法调用存储过程:

select @返回参数;

我们现在使用这个方法来调用上面我们创建的select_news,来看看

有人会疑问为什么返回的title是null,而不是像call select_news(1,@title)一样返回的是我们数据库编号对应的数据First App,这是由于我们的存储过程体并没有给title返回参数返回值。

下面我们来看看存储函数

仍然以db_news表为例说明,不过我们在这个存储函数中我们加入其他一些关于存储例程的知识来引入我们这次要谈及的学习对象.

NetShop网店系统
NetShop网店系统

NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces

下载
drop function if exists count_news; 
delimiter // 
create function count_news(hits int) returns int 
comment '根据传入的点击次数统计超过此点击数的信息数目' 
begin//开源代码phprm.com 
   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 -else 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


PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号