MySQL必知必会笔记存储过程游标触mysql创建存储过.pdf
《MySQL必知必会笔记存储过程游标触mysql创建存储过.pdf》由会员分享,可在线阅读,更多相关《MySQL必知必会笔记存储过程游标触mysql创建存储过.pdf(10页珍藏版)》请在三一文库上搜索。
1、MySQL 必知必会笔记存储过程游标触mysql 创建存储过 第二十三章使用存储过程 MySQL5 中添加了存储过程的支持。 大多数 SQL语句都是针对一个或多个表的单条语句。并非所有的操作都怎么简单。经常 会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。 可将其 视为批文件。虽然他们的作用不仅限于批处理。 为什么要使用存储过程:优点 1 通过吧处理封装在容易使用的单元中,简化复杂的操作 2 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果开发人员和 应用程序都使用了同一存储过程,则所使用的代码是相同的。还有就是防止错误
2、,需要执行 的步骤越多,出错的可能性越大。防止错误保证了数据的一致性。 3 简化对变动的管理。如果表名、 列名或业务逻辑有变化。只需要更改存储过程的 代码,使用它的人员不会改自己的代码了都。 4 提高性能,因为使用存储过程比使用单条SQL语句要快 5 存在一些职能用在单个请求中的MySQL 元素和特性, 存储过程可以使用它们来编 写功能更强更灵活的代码 换句话说 3个主要好处简单、安全、高性能 缺点 1 一般来说, 存储过程的编写要比基本的SQL语句复杂, 编写存储过程需要更高的 技能,更丰富的经验。 2 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创 建,允许用户使用
3、存储过程,但不允许创建存储过程 存储过程是非常有用的,应该尽可能的使用它们 执行存储过程 MySQL称存储过程的执行为调用,因此MySQL 执行存储过程的语句为CALL .CALL 接受存储过程的名字以及需要传递给它的任意参数 CALL productpricing(pricelow , pricehigh , priceaverage); /执行名为productpricing的存储过程,它计算并返回产品的最低、最高和 平均价格 创建存储过程 CREATE PROCEDURE 存储过程名 () 一个例子说明:一个返回产品平均价格的存储过程如下代码: CREATE PROCEDURE prod
4、uctpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END; /创建存储过程名为productpricing,如果存储过程需要接受参数,可以在() 中列举出来。即使没有参数后面仍然要跟()。BEGIN和 END语句用来限定存储过程体,过 程体本身是个简单的SELECT 语句 在 MYSQL 处理这段代码时会创建一个新的存储过程productpricing。没有返回数 据。因为这段代码时创建而不是使用存储过程。 Mysql命令行客户机的分隔符 默认的 MySQL 语句分隔符为分号 ; 。Mysql 命令
5、行实用程序也是 ; 作为语句分隔 符。如果命令行实用程序要解释存储过程自身的 ; 字符,则他们最终不会成为存储过程的 成分,这会使存储过程中的SQL出现句法错误 解决方法是临时更改命令实用程序的语句分隔符 DELIMITER / /定义新的语句分隔符为/ CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END / DELIMITER ; /改回原来的语句分隔符为 ; 除 符号外,任何字符都可以作为语句分隔符 CALL productpricing(); /
6、使用 productpricing存储过程 执行刚创建的存储过程并显示返回的结果。因为存储过程实际上是一种函数,所以 存储过程名后面要有() 符号 删除存储过程 DROP PROCEDURE productpricing ; /删除存储过程后面不需要跟(), 只给出 存储过程名 为了删除存储过程不存在时删除产生错误,可以判断仅存储过程存在时删除 DROP PROCEDURE IF EXISTS 使用参数 Productpricing只是一个简单的存储过程,他简单地显示SELECT语句的结果。 一般存储过程并不显示结果,而是把结果返回给你指定的变量 CREATE PROCEDURE produc
7、tpricing( 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指
8、出相应的参 数用来从存储过程传给一个值(返回给调用者) 。 MySQL支持 IN(传递给存储过程) 、OUT (从 存储过程中传出、如这里所用)和INOUT (对存储过程传入和传出)类型的参数。存储过程 的代码位于BEGIN和 END语句内,如前所见,它们是一些列SELECT语句,用来检索值,然 后保存到相应的变量(通过INTO关键字) 调用修改过的存储过程必须指定3个变量名: CALL productpricing(pricelow , pricehigh , priceaverage); 这条 CALL语句给出 3个参数,它们是存储过程将保存结果的3个变量的名字 变量名所有的 MySQL
9、变量都必须以 开始 使用变量 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
10、 ototal; END; /onumber定义为 IN ,因为订单号时被传入存储过程,ototal定义为 OUT ,因 为要从存储过程中返回合计,SELECT 语句使用这两个参数,WHERE 子句使用onumber 选择正 确的行, INTO使用 ototal存储计算出来的合计 为了调用这个新的过程,可以使用下列语句: CALL ordertotal(2005 , total); /这样查询其他的订单总计可直接改变订单 号即可 SELECT total; 建立智能的存储过程 上面的存储过程基本都是封装MySQL 简单的 SELECT 语句,但存储过程的威力在它 包含业务逻辑和智能处理时才显示
11、出来 例如: 你需要和以前一样的订单合计,但需要对合计增加营业税,不活只针对某些 顾客(或许是你所在区的顾客)。那么需要做下面的事情: 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)
12、- 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
13、 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% ) , SE
14、LECT 语句已经改变,因此其结果存储到total局部变量中而不是ototal。IF 语句检查 taxable是否为真, 如果为真, 则用另一SELECT 语句增加营业税到局部变量total,最后用 另一 SELECT 语句将 total(增加了或没有增加的)保存到ototal中。 COMMENT关键字本列中的存储过程在CREATE PROCEDURE 语句中包含了一个COMMENT 值,他不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示 IF语句这个例子中给出了MySQL 的 IF 语句的基本用法。IF 语句还支持ELSEIF 和 ELSE子句(前者还使用T
15、HEN子句,后者不使用) 检查存储过程 为显示用来创建一个存储过程的CREATE 语句,使用SHOW CREATE PROCEDURE语句 SHOW CREATE PROCEDURE ordertotal; 为了获得包括何时、有谁创建等详细信息的存储过程列表。使用SHOW PROCEDURE STATUS. 限制过程状态结果, 为了限制其输出, 可以使用LIKE 指定一个过滤模式, 例如:SHOW PROCEDURE STATUS LIKE ordertotal; 第二十四章使用游标 MySQL5 添加了对游标的支持 只能用于存储过程 由前几章可知, mysql 检索操作返回一组称为结果集的行
16、。都与 mysql 语句匹配的行 (0 行或多行),使用简单的SELECT 语句, 没有办法得到第一行、下一行或前10行,也不存在每 次行地处理所有行的简单方法(相对于成批处理他们) 有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标 (cursor )是一个存储在MYSQL 服务器上的数据库查询,它不是一条SELECT 语句,而是被 该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数 据。 游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出 更改。 使用游标 使用游标涉及几个明确的步骤: 1 在能够使用游标前,必
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MySQL 必知必会 笔记 存储 过程 游标 创建
链接地址:https://www.31doc.com/p-4696218.html