将会用到的几个表
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. GitHub 第一坑:换行符自动转换

    源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权威指南>,翻了几页,妈呀,那叫一个复杂,又是 Cygwin 又是命令行的,吓得我不敢学了 ...

  2. Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源

    如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法. 比如,在单元测试中模拟一个异步操作. static async Task<T> DelayedResult<T& ...

  3. Android 实现页面跳转并传递参数教程

    首先我们来看一下实现的功能:     第二,我们看一下实现这个功能,总共会接触到哪些文件和代码. 1.实现本功能总共涉及如下6个文件 2.实现本功能,总共涉及如下6个文件中的如下代码: (1) 效果: ...

  4. 【spring boot】spring boot 前台GET请求,传递时间类型的字符串,后台无法解析,报错:Failed to convert from type [java.lang.String] to type [java.util.Date]

    spring boot 前台GET请求,传递时间类型的字符串,后台无法解析,报错:Failed to convert from type [java.lang.String] to type [jav ...

  5. Android上的单元测试

    Android上的单元测试 http://www.sina.com.cn  2009年12月04日 16:07  IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...

  6. Git:远程仓库的使用

    查看当前的远程库 要查看当前配置有哪些远程仓库,可以用git remote 命令,它会列出每个远程库的简短名字.在克隆完某个项目后,至少可以看到一个名为origin 的远程库,Git 默认使用这个名字 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...

  8. 用开源项目RangBar来实现有范围的SeekBar

    RangeBar是一个可以有选择范围的Seekbar,用这个项目其实是很简单的.就是一个自定义控件~ 一.布局文件 这里可以看到有很多属性可以定制,除了通过xml来定义也可以再java代码中进行定义. ...

  9. DataGridView设置列标题不换行

    dgv.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.False;  //设置列标题不换行 // 设定包括Header和所 ...

  10. go语言之进阶篇主协程先退出

    1.主协程先退出 示例: package main import ( "fmt" "time" ) //主协程退出了,其它子协程也要跟着退出 func main ...