zoukankan      html  css  js  c++  java
  • MySQL基础入门学习【13】存储过程

    SQL命令 --> MySQL引擎首先对于我们输入的SQL命令进行语法分析,来看一下我们输入的语句是否 -->语法正确  --> 编译,成MySQL引擎可识别命令 -->执行,并将-->执行结果-->返回给客户端。

    如果我们省略其中语法分析和编译的环节,MySQL的执行效率就会提高。

    【存储过程】是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理;

              存储过程存储在数据库内,可以有应用程序调用执行,且允许用户进行声明变量以及及进行流程控制;

          存储过程可以接受参数,可以接受输入、输出类型的参数,并且可以存在多个返回值。

    【存储过程的优点】:1. 增强了SQL语句的功能和灵活性: 存储过程内可以写控制语句,具有很强的灵活性、可以完成复杂的判断等;

              2. 实现了较快的执行速度: 如果某一个操作包含大量的SQL语句,这些语句都将被MySQL引擎执行语法分析、编译、执行,效率相对较低;

                           而存储过程是预编译的,当客户端第一次调用此存储过程时,MySQL引擎将对其进行语法分析、编译等操作,然后将此编译结果存储到内存当中,以后客户端再次调用此存储过程时便直接从内存当中执行,效率较高,速度较快

              3. 减少网络流量: 如果我们通过客户端每个单独发送SQL语句让服务器执行的话,通过HTTP协议提交的数据量相对较大;

                       而应用存储过程,我们只需要传递存储过程的名字、需要的数值就可以了,提交给服务器的数据量相对较小。

    【创建存储过程】:

    CREATE 

    [DEFINER = { user | CURRENT_USER }]  创建者, 默认当前登录到MySQL客户端的用户

    PROCEDURE sp_name ([proc_parameter[,...]])  存储过程的名字,可以有0~多个参数

    [characteristic ...] routine_body  特性 (与自定义函数相同), 过程体

    proc_parameter:

    [ IN | OUT | INOUT ] param_name type

    [参数]:

    IN :表示该参数的值必须在调用存储过程时指定;

    OUT:表示该参数的值可以被存储过程中的代码改变,并且可以返回; 

    INOUT:表示该参数在调用时指定,并且可以被存储过程的过程体改变和返回给调用者。

    [特性]:

    COMMENT 'string'

    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

    | SQL SECURITY { DEFINER | INVOKER }

    其中:

    COMMENT : 注释

    CONTAINS SQL : 包含SQL语句,但不包含读或写数据的语句

    NO SQL : 不包含SQL语句

    READS SQL DATA : 包含读数据的语句

    MODIFIES SQL DATA : 包含写数据的语句

    SQL SECURITY { DEFINER | INVOKER } : 指明谁有权限来执行

    [过程体]:

    过程体由合法的SQL语句构成;

    可以是"任意"(对于记录的增、删、改、查、多表连接操作)SQL语句 (我们不可能通过存储过程创建数据表,也不可能通过存储过程创建数据库);

    过程体如果为复合结构(超过了两个以上的语句)则使用BEGIN...END语句;

    复合结构语句内可以声明变量,可以使用流程控制语句(if 语句、when语句)以及while循环等。

    【例1——创建没有参数的存储过程】:

    【调用存储过程】 CALL sp_name([parameter[,...]]) 或者 CALL sp_name[()]

    如果存储过程在封装时没有参数,那么()可以有也可以没有;如果存储过程封装过程中有参数,则()不能省略;

    【例2——创建有IN类型参数的存储过程】:

    假如我们从数据表中经常要删除记录 DELETE FROM tbl_name WHERE xxx,我们就可以将这个过程封装成一个存储过程:

    !!!注意!!! 给参数的时候,参数的名字不能和数据表中的记录名相同,否则所有记录都会被删除。

    【修改存储过程】 ALTER PROCEDURE sp_name [characteristic ...]

            COMMENT 'string'

            | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}

            | SQL SECURITY { DEFINER | INVOKER}

    上述方法只能修改注释、内容类型等,并不能修改过程体。

    只能删除当前存储过程,再重建。

    【删除存储过程】:DROP PROCEDURE [IF EXISTS] sp_name

    正确创建方法如下:

    【例3——创建有IN和OUT类型参数的存储过程】 

    从数据表中删除id不固定的记录,并且返回剩余的记录数:

    @nums其实就是变量。变量也可以在BEGIN...END中声明。

    区分: 通过DECLARE声明(该语句必须位于BEGIN..END块的第一行)的变量为局部变量,作用范围只在BEGIN..END语句块之间。

    通过(SELECT... INTO或)SET @语句声明的变量我们称之为用户变量,跟MySQL的客户端绑定。通过这种方法声明的变量只对当前用户所使用的客户端生效。

    【例4——创建有多个OUT类型参数的存储过程】

    根据age字段删除用户,返回删除的用户数以及剩余的用户数:

    SELECT ROW_COUNT(); 得到行数,准确地讲是得到插入、删除、更新的被影响到的记录总数 

    【存储过程与自定义函数的区别】:

    1. 存储过程实现的功能要复杂一些;而函数的针对性更强: 一般,我们很少用函数对表做操作,但经常用存储过程对表做操作。

    2. 存储过程可以返回多个值;而函数只能有一个返回值。

    3. 存储过程一般独立的来执行(CALL sp_name...); 而函数主要是作为其他SQL语句的组成部分来出现(和内置的函数相同)。

    实际应用中我们很少用函数,但是我们经常可以把复杂的过程封装成存储过程。

    存储过程只能修改简单的特性,不能修改过程体。如果想修改过程体,只能先将存储过程删除再创建。

    [参考链接]   https://www.imooc.com/learn/122 

  • 相关阅读:
    如何定义开发完成?(Definition of Done)
    Git协同工作流介绍
    Git常用命令拾遗
    搭建基于Docker社区版的Kubernetes本地集群
    Mqtt学习指南
    JavaWeb 学习总结
    异常:org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    MySQL 插入中文错误:java.sql.SQLException: Incorrect string value:
    Servlet 中文乱码问题解析及详细解决方法
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/jade-91/p/8687928.html
Copyright © 2011-2022 走看看