MySQL存储过程和游标[通俗易懂]

MySQL存储过程和游标[通俗易懂]一、存储过程什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。什么是存储过程:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-S

MySQL存储过程和游标

一、存储过程

什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。

什么是存储过程:

存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样

实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用

他就行了。

存储过程的好处:

  1. 由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比

    T-SQL语句高。

  2. 一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。

  3. 通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全

存储过程的基本语法:

--------------------创建存储过程------------------------------------
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 指定过滤模式

代码100分

代码100分备注:mysql命令行实用程序使用;作为语句分隔符,所以用命令行写存储过程自身内的;字符,会使存储过程的SQL出现句法错误。解决办法是临时更改命令行的语句分隔符,如下所示:
-- 更改MySQL分隔符 除符号外,任何字符都可以用作语句分隔符。
DELIMITER //
DELIMITER ;

代码100分

存储过程示例:

场景:

你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客。那么,你需要做下面几件事情:

  • 获得合计;

  • 把营业税有条件地添加到合计;

  • 返回合计(带或不带税)。

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

-- 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_pricequantity)
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;

1580031909831

CALL ordertotal(20005, 1, @total);
SELECT @total;

1580031874363

二、游标

什么是游标以及如何使用游标。

什么是游标:

MySQL检索操作返回一组结果集。MySQL使用简单的select语句没有办法得到第一行、下一行或前10行,也不能成批地处理它们。

  • 游标可以从结果集中做到返回单个结果

  • 使用游标可以轻易的取出在检索出来的行中前进或后退一行或多行的结果

  • 游标可以遍历返回的多行结果。

补充:MySQL中游标只适用于存储过程以及函数。

使用游标步骤:

  1. 在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的select语句。

  2. 一旦声明后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。

  3. 对于有数据的游标,根据需要取出(检索)各行。

  4. 在结束游标使用时,必须关闭游标。

在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。

语法:

  1. 定义游标

    DECLARE <游标名> CURSOR
    FOR
    select语句;

  2. 打开游标

    OPEN <游标名>;

  3. 使用游标

    使用游标需要用关键字FETCH来取出数据,然后取出的数据需要有存放的地方,我们需要用declare声明变量存放列的数据其语法格式为:

    DECLARE variable1 数据类型(与列值的数据类型相同);
    FETCH [NEXT|PRIOR|FIRST|LAST] FROM <游标名> INTO [variable1,variable2,…]

  4. 关闭游标

    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;

1580038166242

三、MySQL学习脚本:

链接:https://pan.baidu.com/s/1U4HI-AC49ZUb730odAUkjw 提取码:lti7

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10163.html

(0)
上一篇 2023-01-24
下一篇 2023-01-24

相关推荐

  • Spark 单机环境配置[通俗易懂]

    Spark 单机环境配置[通俗易懂]"概要" "Spark 单机环境配置" "JDK 环境配置" "Spark 环境配置" "python 环境配

    2023-02-02
    157
  • Python使用log10()函数对数值100进行对数变换

    Python使用log10()函数对数值100进行对数变换log10()函数是Python内置的数学函数之一,用于返回数字的以10为底的对数,即log10(x)返回的是log(x)以10为底的对数。在Python中,该函数的使用方法为:import math后直接调用math.log10(x)即可,其中x代表需要进行对数变换的数值。需要注意的是,在使用log10()函数时,x的取值不能为0或负数,否则会报错。

    2024-01-07
    107
  • Python工程师漫谈PostgreSQL数据库创建

    Python工程师漫谈PostgreSQL数据库创建在今天的技术领域中,无论是开发还是数据处理,数据库都是一个不可或缺的组成部分。其中,PostgreSQL作为一种功能强大的开源关系型数据库,越来越被广泛使用,因为它不仅支持SQL标准,而且还具有数百种扩展功能。 本文将介绍如何使用Python来创建PostgreSQL数据库,从而帮助那些可能希望在开发过程中使用这种数据库的Python工程师们。

    2024-06-01
    71
  • Python字典获取(Get)操作的实现方法

    Python字典获取(Get)操作的实现方法Python字典是一种存储键值对的无序集合,可以通过键来访问对应的值。字典中的键必须是不可变的(不可改变的对象),如字符串、数字、元组等,而值可以是任意对象。

    2023-12-10
    112
  • HBase Filter 过滤器之QualifierFilter详解

    HBase Filter 过滤器之QualifierFilter详解前言: 本文详细介绍了 HBase QualifierFilter 过滤器 Java&Shell API 的使用,并贴出了相关示例代码以供参考。QualifierFilter 基于列名进行过滤

    2023-02-27
    162
  • elk 日志_docker logs 没有日志

    elk 日志_docker logs 没有日志第一部分 概括 ELK是集分布式数据存储、可视化查询和日志解析于一体的日志分析平台。ELK=elasticsearch+Logstash+kibana,三者各司其职,相互配合,共同完成日志的数据处理工

    2023-02-27
    138
  • python爬虫网页爬取关键词_python爬取新闻标题

    python爬虫网页爬取关键词_python爬取新闻标题我是个微博重度用户,工作学习之余喜欢刷刷timeline看看有什么新鲜事发生,也因此认识了不少高质量的原创大V,有分享技术资料的,比如好东西传送门;有时不时给你一点人生经验的,比如石康;有高产的段子手,比如银教授;有黄图黄段子小能手,比如阿良哥哥 木木萝希木 初犬饼…

    2023-08-25
    130
  • leetcode176(第二高的薪水)–SQL查询实现「建议收藏」

    leetcode176(第二高的薪水)–SQL查询实现「建议收藏」求: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。 +—-+——–+ | Id | Salary | +—-+——–+ | 1 |…

    2023-03-30
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注