将会用到的几个表
mysql> DESC products;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| prod_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| vend_id    | int(11)      | YES  |     | NULL    |                |
| prod_name  | varchar(100) | YES  |     | NULL    |                |
| prod_price | int(11)      | YES  |     | NULL    |                |
| prod_desc  | varchar(300) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
 
mysql> DESC orders;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| order_num  | int(11)     | NO   | PRI | NULL    | auto_increment |
| order_date | date        | YES  |     | NULL    |                |
| cust_id    | varchar(20) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
 
mysql> DESC orderitems;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| order_num  | int(11)     | NO   | PRI | NULL    | auto_increment |
| order_item | varchar(20) | YES  |     | NULL    |                |
| prod_id    | varchar(20) | YES  |     | NULL    |                |
| quantity   | int(11)     | YES  |     | NULL    |                |
| item_price | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
 
创建存储过程:参数需要指定 OUT / IN / INOUT
 
CREATE PROCEDURE productpricing(
     OUT pl DECIMAL(8,2),
     OUT ph DECIMAL(8,2),
     OUT pa DECIMAL(8,2)
)
BEGIN
     SELECT Min( prod_price)
     INTO pl
     FROM products;
     SELECT Max( prod_price)
     INTO ph
     FROM products;
     SELECT Avg( prod_price)
     INTO pa
     FROM products;
END;
 
调用存储过程:
CALL productpricing( @pricelow, @pricehigh, @priceaverage);
 
选择返回的值:
SELECT @pricelow;
SELECT @pricelow,@pricehigh,@priceaverage  --选择多个
 
删除存储过程:
DROP PROCEDURE productpricing;
 
-------------------------------------------------
 
CREATE PROCEDURE ordertotal(
     INT onumber INT,
     OUT ototal DECIMAL(8,2)
)
BEGIN
     SELECT sum(item_price * quantity)
     FROM orderitems
     WHERE order_num = onumber
     INTO ototal;
END;
 
调用:
CALL ordertotal(20005, @total);
 
SELECT @total;
 
存储过程实际场景:需要获得以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客,那么需要做:
1. 获得合计
2. 把营业税有田间的添加到合计
3. 返回合计(带或不带税)
 
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT octoal DECIMAL(8,2)
)
BEGIN
     -- 注释 Declare variable for total
     DECLARE total DECIMAL(8,2);
     DECLARE taxrate INT DEFAULT 6;
 
     -- Get the order total
     SELECT Sum( item_price * quantity)
     FROM orderitems
     WHERE order_num = onumber
     INTO total;
 
     -- Is this taxable ?
     IF taxable THEN
          SELECT total + (tatal / 100 *taxrate) INTO total;
     END IF;
     
     SELECT total INTO ototal;
END;
     
CALL ordertotal(2005, 0, @total);
SELECT @total;
 
检查存储过程:
SHOW CREATE PROCEDURE ordertoal;
 
--------------------------------------------------
--------------------------------------------------
 
     SELECT 返回的是一个结果集,可能含有多行数据,有时候需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标(CURSOR) 是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被语句检索出来的结果集。在存储了游标之后应用程序可以根据需要滚动或浏览其中的数据。
     游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或作出更改。
 
     MySQL游标只能用于存储过程。
使用游标的步骤:
1. 定义游标(针对某个SELECT语句)
2. 打开游标
3. 对填有数据的游标,根据需要取出各行
4. 关闭游标
 
简单示例:
CREATE PROCEDURE processorders()
BEGIN
     DECLARE ordernumbers CURSOR
     FOR
     SELECT order_num FROM orders;
 
     OPEN ordernumbers;
 
     CLOSE ordernumbers;
END;
---------------- 使用游标数据
 
CREATE PROCEDURE processorders()
BEGIN
 
     DECLARE o INT;
     DECLARE ordernumbers CURSOR
     FOR
     SELECT order_num FROM orders;
 
     OPEN ordernumbers;
 
     FETCH ordernumbers INTO o;
 
     CLOSE ordernumbers;
END;
----------------循环检索数据
 
CREATE PROCEDURE processorders()
BEGIN
 
     DECLARE o INT;
     DECLARE done BOOLEAN DEFAULT 0;
 
     DECLARE ordernumbers CURSOR
     FOR
     SELECT order_num FROM orders;
 
     -- Declare continue handler
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     -- SQLSTATE '02000' 是一个未找到条件,当没有更多行可读的时候设置 done = 1 然后退出
 
     OPEN ordernumbers;
     REPEAT
 
          FETCH ordernumbers INTO o;
 
     UNTIL done END REPEAT;
 
     CLOSE ordernumbers;
END;
-----------------------------------------------------
-----------------------------------------------------
------使用table 记录CURSOR FETCH 出来的值
CREATE PROCEDURE processorders()
BEGIN
 
     DECLARE o INT;
     DECLARE done BOOLEAN DEFAULT 0;
     DECLARE t DECIMAL(8,2);
 
     DECLARE ordernumbers CURSOR
     FOR
     SELECT order_num FROM orders;
 
     -- Declare continue handler
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     -- SQLSTATE '02000' 是一个未找到条件,当没有更多行可读的时候设置 done = 1 然后退出
 
     -- 创建table
     CREATE TABLE IF NOT EXISTS ordertotals(
          order_num INT, total DECIAML(8,2)
     );
 
     OPEN ordernumbers;
     REPEAT
 
          FETCH ordernumbers INTO o;
          CALL ordertotal(o,1,t); -- 调用过程
 
          -- 插入table
          INSERT INTO ordertotals(order_num, total)
          VALUES(o,t);
 
     UNTIL done END REPEAT;
 
     CLOSE ordernumbers;
END;
-----------------------------------------------------
-----------------------------------------------------
触发器:在事件发生的时候自动执行
创建触发器时,需要给出4条信息:
1.唯一的触发器名
2.触发器关联的表
3.触发器应该响应的活动(DELETE/ INSERT / UPDATE)
4.触发器何时执行
--------------------
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
 
--该例子触发器在每次插入之后显示 Product added 消息
 
---删除触发器
 
DROP TRIGGER newproduct;
 
--------------------------------------------------
--------------------------------------------------
事务处理( transaction processing) 可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么不执行。
几个术语:
事务:transaction 指一组SQL语句
回退:rollback 指撤销指定SQL语句过程
提交:commit 指将为存储的SQL语句结果写入数据库表
保留点:savepoint 指事务处理中设置的临时占位符,你可以对它发布退回
-------------
SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals; --删除表
SELECT * FROM ordertotals; -- 确认删除
ROLLBACK; -- 回滚
SELECT * FROM ordertotal; -- 再次显示
 
--------------commit
一般的MySQL语句都是直接针对数据库表进行操作,进行隐含的提交,即提交操作是自动执行的。
在 事务处理中,提交不会隐含执行,需要使用COMMIT语句。
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;

MySQL 存储过程/游标/事务的更多相关文章

  1. MySQL存储过程之事务管理

    原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...

  2. MySQL存储过程 游标

    MySQL存储过程  游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...

  3. mysql存储过程之事务篇

    mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...

  4. mysql存储过程游标嵌套循环

    自己写的一个mysql存储过程如下: BEGIN DECLARE _did bigint(20);DECLARE _count int;DECLARE s1 int;DECLARE cur_1 CUR ...

  5. Mysql存储过程包括事务,且传入sql数据运行

    有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE ...

  6. mysql之——存储过程 + 游标 + 事务

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...

  7. php调用mysql存储过程游标

    <?php $dbtype = 'mysql'; $host = 'localhost'; $dbname = 'test'; $dsn = "$dbtype:host=$host;d ...

  8. mysql存储过程游标加计划任务事件调度器

    存储过程加事件调度器 -- 存储过程 (多个)游标的使用 临时表的使用(让执行时间从一个小时降低到5分钟)DELIMITER $$ DROP PROCEDURE IF EXISTS `eval_cal ...

  9. mysql 存储过程 游标嵌套

    基本表temp 包括 name, type, sendCity, getCity 分别对应物流送货司机名, 倒车的第几段, 发货城市, 收货城市 表结构 -- -------------------- ...

随机推荐

  1. VB.NET中Module的概念

    今天学习VB.NET,发现VB.NET里面有一个Module的东西,如下图(图-1)所示: 图-1 上网查了一下VB.NET里面的Module,才发现这是学习VB.NET遇到的第一个典型的问题就是:为 ...

  2. arcgis10.1安装出现1606错误怎么办?找不到盘符

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ESRIHKEY_LOCAL_MACHINE\SOFTWARE\ESRIHKEY_CURRENT_USER\Softwa ...

  3. 【工具类】怎么进入阿里云docker仓库

    进入阿里云docker仓库. 1.进入官网 2.选择 开发者  --->点击 阿里开源项目 3.选择  服务 点击代码托管.仓库 下的 容器镜像服务 4.点击进入 管理控制台 5.点击镜像搜索, ...

  4. jQuery Ajax方式上传文件实现暂停或取消上传

    未上传时要实现取消,很简单... 但如果用户点击了上传,并加载了进度信息... 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 也可以在 ...

  5. algid parse error, not a sequence错误

    主要使用由于没有对使用openssl生成的公私密钥对进行pkcs8编码,导致程序无法识别参考支付宝.项目用用到RSA加密用openssl生成了一个公私密钥对,在对加密字符串进行数字签名的时候,程序一直 ...

  6. 黑吃黑第四季/全集Banshee迅雷下载

    英文全名Banshee,第5季(2015)Cinemax. 本季看点:<黑吃黑>Ana Ayora加盟第四季,将会饰演Nina Cruz,表面上是在镇里一个聪明而又强悍的新副警长,但实际是 ...

  7. ios成长之每日一遍(day 2)

    接着下来简单说说Label(相当于android的textview)和button的使用, 由于都是与上篇的AppDelegate一致, 所以这一篇就说说ViewController与xib的使用呗. ...

  8. 配置SSD-caffe测试时出现“Check failed: error == cudaSuccess (10 vs. 0) invalid device ordinal”解决方案

    这是由于GPU数量不匹配造成的,如果训练自己的数据,那么我们只需要将solver.prototxt文件中的device_id项改为自己的GPU块数,一块就是0,两块就是1,以此类推. 但是SSD配置时 ...

  9. [转]微信JSAPI 微信内置JSAPI 2015年1月官方正式API接口,分享完整实例

    FROM : http://www.oschina.net/code/snippet_2276613_45290 HTML通过微信,分享朋友圈出发此JSAPI <?php require_onc ...

  10. java中使用MD5进行加密 BASE64Encoder 编码

    原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密     在各种应用系统的开发中,经常需 ...