MySQL存储过程和游标
一、存储过程
什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。
什么是存储过程:
存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样
实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用
他就行了。
存储过程的好处:
由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比
T-SQL语句高。
一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全
存储过程的基本语法:
- --------------------创建存储过程------------------------------------
- CREATE PROCEDURE procedure_name( IN|OUT variable data_type)
- BENGIN
- sql_statement;
- ......
- END;
- -- MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)
- -- variable 变量
- -- data_type 参数的数据类型
- -- sql_statement 中 INTO parameter 的把值保存到相应的变量中(通过INTO关键字)
- --------------------执行存储过程------------------------------------
- CALL procedure_name(@parameters);
- --------------------删除存储过程------------------------------------
- DROP PROCEDURE procedure_name;
- -- 如果指定的过程不存在,则DROP PROCEDURE将会产生一个错误。
- -- 使用DROP PROCEDURE IF EXISTS
- --------------------检查存储过程------------------------------------
- SHOW CREATE PROCEDURE procedure_name;
- -------------------------------------------------------------------
- -- 为了获得包括何时、有谁创建等详细信息的存储过程列表,使用
- SHOW PROCEDURE STATUS LIKE ' ';
- -- LIKE 指定过滤模式
- 备注:mysql命令行实用程序使用;作为语句分隔符,所以用命令行写存储过程自身内的;字符,会使存储过程的SQL出现句法错误。解决办法是临时更改命令行的语句分隔符,如下所示:
- -- 更改MySQL分隔符 除\符号外,任何字符都可以用作语句分隔符。
- DELIMITER //
- DELIMITER ;
存储过程示例:
场景:
你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客。那么,你需要做下面几件事情:
获得合计;
把营业税有条件地添加到合计;
返回合计(带或不带税)。
存储过程的完整工作如下:
- -- Name: ordertotal
- -- Parameters: onumber = order number
- -- taxable = 0 if not taxable, 1 if taxable
- -- ototal = order total variable
- DROP PROCEDURE IF EXISTS ordertotal;
- CREATE PROCEDURE ordertotal(
- IN onumber INT,
- IN taxable BOOLEAN,
- OUT ototal DECIMAL(8,2)
- ) COMMENT 'Obtion ordertotal, optionally adding tax'
- BENGIN
- -- Declare variable for total
- DECLARE total DECIMAL(8,2);
- -- Declare tax percentage
- 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
- -- Yes, so add taxrate to the total
- SELECT total+(total/100*taxrate) INTO total;
- END IF;
- -- And finally, save to out variable
- SELECT total INTO ototal;
- END;
执行存储过程:
- CALL ordertotal(20005, 0, @total);
- SELECT @total;
- CALL ordertotal(20005, 1, @total);
- SELECT @total;
二、游标
什么是游标以及如何使用游标。
什么是游标:
MySQL检索操作返回一组结果集。MySQL使用简单的select语句没有办法得到第一行、下一行或前10行,也不能成批地处理它们。
游标可以从结果集中做到返回单个结果
使用游标可以轻易的取出在检索出来的行中前进或后退一行或多行的结果
游标可以遍历返回的多行结果。
补充:MySQL中游标只适用于存储过程以及函数。
使用游标步骤:
在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的select语句。
一旦声明后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。
对于有数据的游标,根据需要取出(检索)各行。
在结束游标使用时,必须关闭游标。
在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。
语法:
定义游标
- DECLARE <游标名> CURSOR
- FOR
- select语句;
- DECLARE <游标名> CURSOR
打开游标
- OPEN <游标名>;
使用游标
使用游标需要用关键字FETCH来取出数据,然后取出的数据需要有存放的地方,我们需要用declare声明变量存放列的数据其语法格式为:
- DECLARE variable1 数据类型(与列值的数据类型相同);
- FETCH [NEXT|PRIOR|FIRST|LAST] FROM <游标名> INTO [variable1,variable2,…]
- DECLARE variable1 数据类型(与列值的数据类型相同);
关闭游标
- CLOSE <游标名>;
游标示例:
- DROP PROCEDURE IF EXISTS processorders;
- CREATE PROCEDURE processorders()
- BEGIN
- -- Declare local variables
- DECLARE done BOOLEAN DEFAULT 0;
- DECLARE o INT;
- DECLARE t DECIMAL(8,2);
- -- Declare the cursor
- DECLARE ordernumbers CURSOR
- FOR
- SELECT order_num FROM orders;
- -- Declare continue handler
- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
- -- Create a table to store the result
- CREATE TABLE IF NOT EXISTS ordertotals(
- id INT PRIMARY KEY AUTO_INCREMENT,
- order_num INT NOT NULL,
- total DECIMAL(8,2)
- );
- -- Open the cursor
- OPEN ordertotals;
- -- Loop through all rows
- REPEAT
- -- Get order number
- FETCH ordertotals INTO o;
- -- Get the total for this order
- CALL ordertotal(o, 1, t);
- -- Insert order and total into ordertotals
- INSERT INTO ordertotals(order_num, total) VALUES(o, t);
- -- End of loop
- UNTIL done END REPEAT;
- -- Close the cursor
- CLOSE ordertotals;
- END;
- CALL ordertotal();
- SELECT * FROM ordertotals;
三、MySQL学习脚本:
链接:https://pan.baidu.com/s/1U4HI-AC49ZUb730odAUkjw 提取码:lti7
MySQL存储过程和游标的更多相关文章
- mysql存储过程之游标遍历数据表
原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕 ...
- MySQL存储过程之游标实战
MySQL存储过程之游标实战 博主日前在解决一个项目需求时,没有什么好的方法,于是就来学习存储过程了,之前也是接触过,奈何年少贪玩,竟是全部又还给了大学老师-苦不堪言呐-. 先说一下业务需求吧 ...
- MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明
MariaDB.MySQL存储过程.游标基础应用举例说明 by:授客 QQ:1033553122 测试环境: MariaDB-10.0.19-centos7-x86_64 实践操作: # 创建测试数据 ...
- MYSQL存储过程、游标、触发器
MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的使用而保存的一 ...
- mysql存储过程之游标
MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的 ...
- MYSQL学习拓展一:MySQL 存储过程之游标的使用!
一.MySQL游标的概念 游标介绍: MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想, ...
- 解析MySQL存储过程的游标执行过程
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 内容提纲 一.测试环境搭建 二.执行过程解析 三.注意事项 一.测试环境搭建 首先创建一张表,并插入几行数据字段: CRE ...
- Mysql 存储过程使用游标
-- 完整例子 CREATE PROCEDURE test BEGIN -- 定义参数 DECLARE _id INT; -- 定义游标 DECLARE no_more_products ...
- MySQL存储过程-->通过游标遍历和异常处理迁移数据到历史表
-- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表. DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_x ...
随机推荐
- python类型-字典
字典是python语言中唯一的映射类型,映射对象里哈希值(键,key)和指向的对象(值,value)是一对多的关系.一个字典对象是可变的,是一个容器类型,可存储任意个数的python对象,其中也可以包 ...
- P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- Linux网络文件共享服务之NFS
一.NFS服务简介 NFS全称network file system 网络文件系统,基于内核的文件系统,有sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,它基于r ...
- Java容器解析系列(11) HashMap 详解
本篇我们来介绍一个最常用的Map结构--HashMap 关于HashMap,关于其基本原理,网上对其进行讲解的博客非常多,且很多都写的比较好,所以.... 这里直接贴上地址: 关于hash算法: Ha ...
- mysql安装教程linux
https://www.cnblogs.com/YangshengQuan/p/8431520.html 设置sql远程访问
- python(从放弃到从头开始)
本节内容 Python介绍 发展史 Python 2 or 3? Hello World程序 变量 用户输入 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for ...
- Promise函数的使用
最近在做批量打印并监控显示打印进度的功能,用到了很多异步函数,很多异步函数嵌套在回调函数里面,层层嵌套,导致代码可阅读性与可维护性变得十分糟糕,而且由于都是异步执行的函数,无法知道什么时候能回调结束, ...
- parzen 窗的matlab实现
用一下程序简单实现使用parzen窗对正态分布的概率密度估计: (其中核函数选用高斯核) %run for parzen close all;clear all;clc; x=normrnd(0,1, ...
- liberty | 在IDEA整合Springboot与IBM liberty
在IDEA整合Springboot与IBM liberty 简介 Liberty 是一款全新的轻量级应用服务器,它将用户的良好开发体验作为最主要的出发点.其主要特点和内容包括: 高模块化--该功能允许 ...
- Redis 面试题汇总
Redis 面试题汇总 1.Redis 使用场景有哪些? 答:Redis 使用场景如下: 记录帖子点赞数.点击数.评论数 缓存近期热帖 缓存文章详情信息 记录用户会话信息 2.Redis 有哪些功能? ...