`
endual
  • 浏览: 3566853 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySql存储例程、存储过程

 
阅读更多
<!--$sinatopbar-->

 

<!--$end sinatopbar-->
<!--主题内容开始 -->
<!--第一列start--> <!--第一列end--><!--第二列start-->
正文 字体大小:
<!--博文正文 begin -->

MySql存储例程、存储过程进阶学习

(2009-07-27 18:05:36)
<script></script>标签:

mysql

存储例程

存储过程

进阶

学习

杂谈

分类: Mysql数据库
<!-- 正文开始 -->

什么是存储例程?
存储例程是存储在数据库服务器中的一组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');

使用上面的表我们创建一个简单的存储过程
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表为例说明,不过我们在这个存储函数中我们加入其他一些关于存储例程的知识来引入我们这次要谈及的学习对象。

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

<!-- 正文结束 -->

0

<!-- 分享到微博 {$t_blog} -->
阅读(104) 评论 (0) 收藏(0) 转载(1) 打印举报
已投稿到:
    <!-- 循环始 -->
  • 评论加载中,请稍候...<!-- 循环终 -->

登录名:密码:找回密码 注册 记住登录状态

昵   称:

分享到微博    评论并转载此博文

验证码:请点击后输入验证码 收听验证码

匿名评论
发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

<!--博文正文 end --> <script type="text/javascript"></script>
<!--第二列start--><!--第三列start-->
  
<!--第三列end-->
<!--主题内容结束 -->

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有

<script id="PVCOUNTER_FORIE" type="text/javascript"></script><script type="text/javascript"></script><script src="http://sjs.sinajs.cn/blog7common/js/boot.js" type="text/javascript"></script><script type="text/javascript"></script><script type="text/javascript"></script>

 

 

分享到:
评论

相关推荐

    mysql存储例程、存储过程、存储函数进阶学习

    MySQL存储例程,包括存储过程和存储函数,是数据库管理中的重要组成部分,它们极大地提高了数据库应用的效率和灵活性。在进阶学习中,我们需要深入理解这些概念及其在实际开发中的应用。 1. **存储过程**:存储过程...

    MySQL存储过程基础教程.pdf

    ### MySQL存储过程基础知识点 #### 1. 存储过程的定义和示例 存储过程是存储在MySQL服务器上的预编译的SQL代码段,它能够接受参数、执行一系列的SQL语句和流程控制语句。存储过程可以提高数据库操作的效率,同时...

    PHP_MySQL_存储过程_最新

    MySQL 5.0中支持两种类型的例程:存储过程和函数。存储过程主要用于执行一系列SQL语句,而函数则用于返回单一结果值,类似于MySQL预定义的函数如`pi()`。 ### 为什么使用存储过程 存储过程提供了以下几点优势: - ...

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

    存储例程包括存储过程和存储函数,它们都是为了提高数据库操作的效率和安全性,减少网络传输,同时提供更好的代码组织和重用。 **存储过程** 主要用于处理复杂的业务逻辑,如数据的增删改查(SELECT, INSERT, ...

    易语言mysql学习例程

    在易语言中连接和操作MySQL数据库,可以实现数据的存储、查询、更新和删除等一系列功能。 这个学习例程可能包括以下关键知识点: 1. 数据库连接:首先,你需要了解如何在易语言中建立到MySQL服务器的连接。这通常...

    易语言帮助文档MySql数据库例程

    在易语言中,与MySQL数据库进行交互是常见的操作,用于实现数据的存储、查询、更新和删除等功能。MySQL是一款流行的开源关系型数据库管理系统,广泛应用于各种规模的项目中。 本“易语言帮助文档MySql数据库例程”...

    易语言源码易语言mysql学习例程.rar

    6. 存储过程与函数的调用:如果例程包含这方面的内容,将展示如何在易语言中调用MySQL的存储过程和自定义函数。 7. 异常处理:在与数据库交互时,如何捕获和处理可能出现的异常情况,保证程序的健壮性。 通过这个...

    Mysql.rar_MYSQL_MYSQL 例程

    最后,考虑到压缩包中的"chp05",这可能是书籍或教程的第五章,可能会深入讲解如何处理更复杂的情况,如事务处理(确保数据一致性)、存储过程(预编译的SQL语句集合)以及触发器(自动响应特定数据库事件的程序)等...

    MYSQL存储过程详解

    ### MySQL存储过程详解 #### 存储过程定义与示例 存储过程是一种预先编写并编译好的SQL程序,它可以被当作一个独立的对象保存在数据库中,并可通过简单的调用来执行复杂操作。MySQL 5.0 版本引入了存储过程功能,...

    VB+Mysql例程

    【VB+Mysql例程】是一个面向初学者和有需求的开发者的学习资源,结合了Visual Basic(VB)编程语言和MySQL数据库系统。VB是Microsoft开发的一种面向对象的编程语言,常用于开发桌面应用程序,而MySQL则是一种流行的...

    易语言mysql学习例程源码

    本学习例程提供了关于MySQL操作的基础教程,源码中包含了一系列的示例,帮助用户掌握如何在易语言中与MySQL进行交互。这些示例涵盖了以下几个关键知识点: 1. **连接数据库**:源码中展示了如何使用易语言建立与...

    mysql存储过程

    ### MySQL存储过程详解 #### 一、存储过程概念与优势 **存储过程**是一种预编译的SQL代码块,它存储在数据库服务器上,并通过指定的名称进行调用。存储过程能够封装复杂的业务逻辑,提高代码的重用性和可维护性。...

    易语言mysql学习例程.zip易语言项目例子源码下载

    本压缩包“易语言mysql学习例程.zip”提供了易语言项目中的MySQL数据库操作实例源码,非常适合初学者及有一定基础的开发者进行学习和参考。 MySQL是一款广泛使用的开源关系型数据库管理系统,它具有高性能、可移植...

    Delphi连接MySQL代码实例..rar

    在实际应用中,你可能还需要处理错误、事务管理、参数化查询、存储过程调用等功能。Delphi提供了强大的数据访问组件和API,使得这些任务变得相对简单。 总的来说,这个"Delphi连接MySQL代码实例"应该包含了如何在...

    dbForge Studio for MySQL 企业版 v8.1.2 教程(最新破Crack解企业版)

    - 无需打开向导即可从数据网格生成快速INSERT语句MySQL存储过程调试器 - 查询分析器 - 执行计划工具等等功能 这是dbforge studio8其他版本不具备的,能够更好的用于MySQL数据库开发。 ## 2.软件 破Crack解 安装...

    MySql的存储过程学习小结 附pdf文档下载

    存储过程是一种存储在数据库库中的程序(就像正规语言里的子程序一样),准确的来说,MySql支持的“routine(例程)”有两种:一是我们说的存储过程,二是在其它sql语句中可以返回值的函数(使用起来和mysql预装载的...

    MySQL的例程通常涉及数据库的创建、表的创建、数据的增删改查(CRUD 操作)等基本操作

    数据表用于存储具体的数据记录。 **SQL命令**: ```sql CREATE TABLE 表名 ( 字段1 数据类型 [约束], 字段2 数据类型 [约束], ... ); ``` 例如,创建一个员工表: ```sql CREATE TABLE employees ( id INT ...

    mysql教程.pdf

    存储过程是一种存储在数据库中的程序,准确来说,MySQL 支持的“routines(例程)”有两种:存储过程和函数。存储过程包括名字、参数列表,以及可以包括很多 SQL 语句的 SQL 语句集。 存储过程的组成部分 存储过程...

    Shiro Mysql 例程

    在这个"Shiro Mysql 例程"中,我们将探讨如何将Shiro与Struts2和MySQL数据库集成,来实现基于角色的访问控制(Role-Based Access Control,简称RBAC)。 1. **Shiro框架介绍**: Shiro提供了一种简洁易用的方式来...

    大话西游II(网络例程+MYSQL+网页注册+客户端登录

    在本资源中,我们主要探讨的是它的网络例程、MySQL数据库运用、网页注册流程以及客户端登录机制,这些都是构建一个稳定、安全且用户友好的网络游戏的关键组成部分。 首先,网络例程是游戏运行的基础,它涉及到游戏...

Global site tag (gtag.js) - Google Analytics