zoukankan      html  css  js  c++  java
  • 创建无参的存储过程(四十七)

    创建无参的存储过程

      这节我们主要来学习Mysql数据库的存储过程,我们知道我们要经常的对数据表进行增删改查的操作,或者叫CURD,实际上,当我们成功的输入SQL命令时,mysql引擎会对输入的命令进行语法分析,来检查一下我们的sql命令是否正确,如果正确的话,将会进行编译,编译成mysql引擎能够识别的语句。最后才开始执行,并将最后执行的结果返回给客户端,这就是mysql命令的执行流程。

      我们想一下,如果我们把这个流程简化一下,比如我们省略掉语法分析和编译环节,那么mysql的执行效率是不是会有很大的提高,那么我们如何实现这个效果,那么就涉及到今天我们要讲的存储过程,那么首先我们来了解一下什么是存储过程?

     

     

     

    一、什么是存储过程?

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

      存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储过程可以接收参数,可以接收输入类型的参数,也可以接收输出类型的参数,并且可以存在多个返回值。

      存储过程的效率要比我们简单的sql语句的执行的效率要高,原因就在于,比如我们要执行两条语句,那么mysql引擎就会逐一的对这两条语句进行分析,编译和执行,而我们使用存储过程之后,只有在第一次才会使用语法分析和编译,以后客户端再调用,只调用编译后的结果就可以了,省略了分析和编译的环节,所以效率要比之前要高,那么存储过程具体会有哪些优点?

     

     

     

    二、存储过程的优点

      第一,增强了sql语句的功能和灵活性。

    因为在存储过程中可以写控制语句,那么就有很强的灵活性,也可以完成复杂的判断和运算。

      第二,实现了较快的执行速度。

    如果某一个操作包含了大量的操作语句,那么这些语句都将被mysql引擎进行语法分析和编译,所以执行过程的效率相对较低,而存储过程是预编译的,当客户端第一次调用这个存储过程的时候,mysql引擎将对他进行语法分析和编译操作,然后把这个编译的结果存储到内存当中,所以说第一次是和之前的效率是相同的,但是以后客户端再次调用这个存储过程的时候,便直接在内存当中来执行,所以说相比效率比较高,速度比较快。

      第三,减少网络流量

    如果我们通过客户端单独发送sql语句让服务器来执行的话,那么通过http协议提交的数据量相对较大,而使用存储过程,我们只需要传递存储过程的名字,后面加上我们要操作的那个值就行了,所以说,他提交给服务器的数据量相对较少,那么也就减少了网络流量。

     

     

     

    三、如何创建存储过程

    1、创建存储过程的语法结构

    CREATE

    [DEFINER={user | CURRENT_USER}]

    PROCEDURE sp_name ([proc_parameter[,...]])

    [characteristic ...] routine_body

    proc_parameter:

    [IN | OUT | INOUT] param_name type

      我们发现他和创建自定义函数的语法结构很相似,最大的不同就是参数部分,DEFINER是创建者,如果省略掉DEFINER这句,,默认就是当前用户,即当前登录到mysql客户端的用户,sp_name指的是存储过程的名字,这里面它可以有0或多个参数,但是从参数的写法我们可以发现,他前面可以带有3个选项,分别IN、OUT、INOUT,他们分别代表什么意思呢?

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

    在存储过程中这个值是不能返回的,就是说只能进,不能出。

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

    out指的是输出。

      INOUT :表示该参数在调用时指定,并且可以被改变和返回

    就是说可以被存储过程的过程体改变并返回给调用者。

     

     

     

    2、过程体

      (1)过程体由合法的SQL语句构成

      (2)过程体可以是“任意”的SQL语句

    当然这个任意是加引号的,我们不可能通过存储过程来创建数据表,也不可能通过存储过程来创建数据库,那么这个所谓的任意主要指的是对记录的增删改查以及多表连接这几个操作。

      (3)过程体如果为复合结构则使用BEGIN...END语句

    也就是说当超过1个语句时,我们就要用BEGIN..END将这些语句包含在其中。

      (4)复合结构可以包含声明、循环、控制结构

    比如if语句、when语句,while循环等等。

     

     

    3、下面我们就来创建一个简单的没有参数的存储过程,假设我们叫它sp1,它可以获取当前mysql版本的这个功能。我们输入CREATE PROCEDURE sp1( ) SELECT VERSION( );

      OK,命令执行成功,这个存储过程我们就创建成功。

      那么既然我们的存储过程创建成功了,那么我们现在就可以来调用我们的存储过程,那么怎么调用呢?

     

     

     

    四、如何调用存储过程?

    存储过程的调用一共有两种结构

    CALL sp_name([parameter[,...]])

    CALL sp_name[( )]

      我们发现他们都是通过关键字CALL来实现,我们发现后边可以带有参数,也可以不带有参数。这里大家可以看一下,当没有参数的时候,我们存储过程名称的后面可以不带有小括号,如果带有参数,我们在调用时就必须加上这个小括号。 下面我们就来调用一下刚才那个没有参数的存储过程,我们输入

    CALL sp1;

      OK,我们就可以得到我们当期mysql的版本信息。当然我们也可以加上小括号,我们输入CALL sp1( );

      OK,同样可以得到mysql的版本信息,这是我们定义的没有参数的存储过程

  • 相关阅读:
    常见数据结构的Java实现
    ASP.NET WEB API的服务托管(Self-HOST)
    Twitter Bootstrap3小结
    RESTful API后台系统架构设计(Java)
    同步函数的异步化
    C#并行库(TaskParallelLibrary)用法小结
    RestSharp用法小结
    如何选择JAVA培训机构,兼议什么样的人适合培训机构
    从零开始理解JAVA事件处理机制(3)
    简单实用UML关系图解
  • 原文地址:https://www.cnblogs.com/zlslch/p/6543290.html
Copyright © 2011-2022 走看看