Mysql存储过程

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。虽然他们的作用不仅限于批处理。

 为什么要使用存储过程:优点

1 通过吧处理封装在容易使用的单元中,简化复杂的操作

2 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果开发人员和应用程序都使用了同一存储过程,则所使用的代码是相同的。还有就是防止错误,需要执行的步骤越多,出错的可能性越大。防止错误保证了数据的一致性。

3 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不会改自己的代码了都。

4 提高性能,因为使用存储过程比使用单条SQL语句要快

5 存在一些职能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码

 换句话说3个主要好处简单、安全、高性能

 缺点

1 一般来说,存储过程的编写要比基本的SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。

2 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建,允许用户使用存储过程,但不允许创建存储过程

 存储过程是非常有用的,应该尽可能的使用它们

 执行存储过程

MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL    .CALL接受存储过程的名字以及需要传递给它的任意参数

CALL productpricing(@pricelow , @pricehigh , @priceaverage);

//执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格

 创建存储过程

CREATE  PROCEDURE 存储过程名()

 一个例子说明:一个返回产品平均价格的存储过程如下代码:

CREATE  PROCEDURE productpricing()

BEGIN

SELECT Avg(prod_price)  AS priceaverage

FROM products;

END;

//创建存储过程名为productpricing,如果存储过程需要接受参数,可以在()中列举出来。即使没有参数后面仍然要跟()。BEGIN和END语句用来限定存储过程体,过程体本身是个简单的SELECT语句

 在MYSQL处理这段代码时会创建一个新的存储过程productpricing。没有返回数据。因为这段代码时创建而不是使用存储过程。

Mysql命令行客户机的分隔符

 默认的MySQL语句分隔符为分号 ; 。Mysql命令行实用程序也是 ; 作为语句分隔符。如果命令行实用程序要解释存储过程自身的 ; 字符,则他们最终不会成为存储过程的成分,这会使存储过程中的SQL出现句法错误

 解决方法是临时更改命令实用程序的语句分隔符

DELIMITER //  //定义新的语句分隔符为//

CREATE PROCEDURE productpricing()

BEGIN

SELECT Avg(prod_price) AS priceaverage

FROM products;

END //

DELIMITER ;  //改回原来的语句分隔符为 ;

 除\符号外,任何字符都可以作为语句分隔符

CALL productpricing();  //使用productpricing存储过程

 执行刚创建的存储过程并显示返回的结果。因为存储过程实际上是一种函数,所以存储过程名后面要有()符号

 删除存储过程

DROP PROCEDURE productpricing ;  //删除存储过程后面不需要跟(),只给出存储过程名

 为了删除存储过程不存在时删除产生错误,可以判断仅存储过程存在时删除

DROP PROCEDURE IF EXISTS

 使用参数

Productpricing只是一个简单的存储过程,他简单地显示SELECT语句的结果。

 一般存储过程并不显示结果,而是把结果返回给你指定的变量

CREATE PROCEDURE productpricing(

OUT p1 DECIMAL(8,2),

OUT ph DECIMAL(8,2),

OUT pa DECIMAL(8,2),

)

BEGIN

SELECT Min(prod_price)

INTO p1

FROM products;

SELECT Max(prod_price)

INTO ph

FROM products;

SELECT Avg(prod_price)

INTO pa

FROM products;

END;

 此存储过程接受3个参数,p1存储产品最低价格,ph存储产品最高价格,pa存储产品平均价格。每个参数必须指定类型,这里使用十进制值。关键字OUT指出相应的参数用来从存储过程传给一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程中传出、如这里所用)和INOUT(对存储过程传入和传出)类型的参数。存储过程的代码位于BEGIN和END语句内,如前所见,它们是一些列SELECT语句,用来检索值,然后保存到相应的变量(通过INTO关键字)

 调用修改过的存储过程必须指定3个变量名:

CALL productpricing(@pricelow , @pricehigh , @priceaverage);

 这条CALL语句给出3个参数,它们是存储过程将保存结果的3个变量的名字

 变量名  所有的MySQL变量都必须以@开始

 使用变量

SELECT @priceaverage ;

SELECT @pricelow , @pricehigh , @priceaverage ;   //获得3给变量的值

 下面是另一个例子,这次使用IN和OUT参数。ordertotal接受订单号,并返回该订单的合计

CREATE PROCEDURE ordertotal(

IN onumber INT,

OUT ototal DECIMAL(8,2)

)

BEGIN

SELECT Sum(item_price*quantity)

FROM orderitems

WHERE order_num = onumber

INTO ototal;

END;

//onumber定义为IN,因为订单号时被传入存储过程,ototal定义为OUT,因为要从存储过程中返回合计,SELECT语句使用这两个参数,WHERE子句使用onumber选择正确的行,INTO使用ototal存储计算出来的合计

 为了调用这个新的过程,可以使用下列语句:

CALL ordertotal(2005 , @total);  //这样查询其他的订单总计可直接改变订单号即可

SELECT @total;

建立智能的存储过程

 上面的存储过程基本都是封装MySQL简单的SELECT语句,但存储过程的威力在它包含业务逻辑和智能处理时才显示出来

 例如:你需要和以前一样的订单合计,但需要对合计增加营业税,不活只针对某些顾客(或许是你所在区的顾客)。那么需要做下面的事情:

1 获得合计(与以前一样)

2 吧营业税有条件地添加到合计

3 返回合计(带或不带税)

 存储过程的完整工作如下:

— Name: ordertotal

— Parameters: onumber = 订单号

—   taxable = 1为有营业税 0 为没有

—   ototal = 合计

CREATE  PROCEDURE ordertotal(

IN onumber INT,

IN taxable BOOLEAN,

OUT ototal DECIMAL(8,2)

— COMMENT()中的内容将在SHOW PROCEDURE STATUS ordertotal()中显示,其备注作用

) COMMENT ‘Obtain order total , optionally adding tax’

BEGIN

— 定义total局部变量

DECLARE total DECIMAL(8,2)

DECLARE taxrate INT DEFAULT 6;

— 获得订单的合计,并将结果存储到局部变量total中

SELECT Sum(item_price*quantity)

FROM orderitems

WHERE order_num = onumber

INTO total;

— 判断是否需要增加营业税,如为真,这增加6%的营业税

IF taxable THEN

SELECT total+(total/100*taxrate) INTO total;

 END IF;

— 把局部变量total中才合计传给ototal中

SELECT total INTO ototal;

END;

 此存储过程有很大的变动,首先,增加了注释(前面放置—)。在存储过程复杂性增加时,这样很重要。在存储体中,用DECLARE语句定义了两个局部变量。DECLARE要求制定变量名和数据类型,它也支持可选的默认值(这个例子中taxrate的默认设置为6%),SELECT 语句已经改变,因此其结果存储到total局部变量中而不是ototal。IF语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量total,最后用另一SELECT语句将total(增加了或没有增加的)保存到ototal中。

 COMMENT关键字  本列中的存储过程在CREATE PROCEDURE 语句中包含了一个COMMENT值,他不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示

IF语句  这个例子中给出了MySQL的IF语句的基本用法。IF语句还支持ELSEIF和ELSE子句(前者还使用THEN子句,后者不使用)

 检查存储过程

 为显示用来创建一个存储过程的CREATE语句,使用SHOW CREATE PROCEDURE语句

SHOW CREATE PROCEDURE ordertotal;

 为了获得包括何时、有谁创建等详细信息的存储过程列表。使用SHOW PROCEDURE STATUS.限制过程状态结果,为了限制其输出,可以使用LIKE指定一个过滤模式,例如:SHOW PROCEDURE STATUS LIKE ”ordertotal;

更详细的使用方法可以参考:http://blog.sina.com.cn/s/blog_86fe5b440100wdyt.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Danny的专栏

《高性能 MySQL》读书笔记

1、隔离级别有四种: READ UNCOMMITTED(未提交读),同事务中某个语句的修改,即使没有提交,对其他事务也是可见的。这个也叫脏读。 READ...

23320
来自专栏python成长之路

My SQL常用操作汇总

24640
来自专栏数据之美

MySQL Tips【Updating】

1、MySQL中varchar最大长度问题 ? 问题:为啥大字段可以建,小字段却失败?  单个varchar(20000)用utf8没有超过64K,不会转成...

23970
来自专栏性能与架构

MySQL 清除表空间碎片

表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用...

39770
来自专栏我是攻城师

ElasticSearch里面一些小坑笔记

47840
来自专栏乐沙弥的世界

绑定变量及其优缺点

    绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能。然刀子磨的太快,使起来锋利,却容 易折...

11220
来自专栏pangguoming

MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》

68720
来自专栏Java技术栈

去BAT面试完的Mysql面试题总结(55道,带完整答案)

55道互联网大公司的经典面试题,全部答对月薪5W+没问题。 1、一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把m...

1.7K50
来自专栏一“技”之长

SQLite数据库常用语句及MAC上的SQLite可视化工具MeasSQLlite使用

        在移动开发中,通常会用到一些小型的数据库进行数据管理。SQLite是一款十分小巧便捷的数据库,在iOS开发中,原生框架也对其有很好的支持。

13250
来自专栏Java后端技术栈

面试中有哪些经典的数据库问题?

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

14210

扫码关注云+社区

领取腾讯云代金券