zoukankan      html  css  js  c++  java
  • 一天一点MySQL复习——存储过程

    一、存储过程概念


      使用SQL编写访问数据库的代码时,可用两种方法存储和执行这些代码,一种是在客户端存储代码,并创建向数据库服务器发送的SQL命令(或SQL语句),比如在C#、Java等客户端编程语言中嵌入访问数据库的SQL语句;另一种是将SQL语句存储在数据库服务器端(实际是存储在具体的数据库中,作为数据库的一个对象),然后由应用程序调用执行这些SQL语句。

      这些存储在数据库服务器端供客户端调用执行的SQL语句就是存储过程,客户端应用程序可以直接调用并执行存储过程,存储过程的执行结果可返回给客户端。

      存储过程可以:

    • 接受输入参数并以输出参数的形式将多个值返回给调用者。
    • 包含执行数据库操作的语句。
    • 将查询语句执行结果返回到客户端内存中。

      总之,存储过程实际是存储在数据库服务器上的、由SQL语句和流程控制语句组成的预编译集合,它以一个名字存储并作为一个单元处理,可由应用程序调用执行,允许包含控制流、逻辑以及对数据的查询等操作。存储过程可以接受输入参数,并可具有输出参数,还可以返回单个或多个结果集。

    二、创建存储过程


    create procedure 过程名字(参数列表)
    begin
        --过程体
    end

      简单实例:

    三、查看存储过程


    show procedure status [like'procedure_name'];

      简单实例:

      其中'G'表示:以每组显示查询结果

      查看创建语句:

    show create procedure procedure_name;

    四、调用存储过程


      不能用select来访问存储过程:

      调用存储过程应该用 call:

    五、修改&删除存储过程


      存储过程不能修改,只能删除后在添加

    drop procedure 存储过程名;

    六、存储过程参数


      函数的参数需要数据类型指定,过程比函数更严格

      过程还有自己的类型限定:

    • in:数据只是从外部传入给内部使用(值传递),可以是数值也可以是变量
    • out:只允许过程内部使用,只能传递变量,引用传递,外部的数据会被先清空才会进入到内部
    • inout:外部可以在内部使用,内部修改也可以在外部使用,引用传递,只能传递变量

      in参数为值传递

      out参数为引用传递,传递至过程中,会将传递参数的本身值清空

      inout参数为引用传递

      实例:

        delimiter $$
        create procedure pro2(in int_1 int,out int_2 int,inout int_3 int)
        begin 
            -- 查看三个变量
            select int_1,int_2,int_3;
        end
        $$
        delimiter ;

        delimiter $$
        create procedure pro3(in int_1 int,out int_2 int,inout int_3 int)
        begin
            -- 查看三个局部变量;
            select int_1,int_2,int_3;
            
            -- 修改三个局部变量;
            set int_1 = 10;
            set int_2 = 100;
            set int_3 = 1000;
    
            -- 查看三个局部变量
            select int_1,int_2,int_3;
    
            -- 查看三个全局变量
            select @int_1,@int_2,@int_3;
    
            --修改三个全局变量
            set @int_1 = 'a';
            set @int_2 = 'b';
            set @int_3 = 'c';
            --查看三个全局变量
            select @int_1,@int_2,@int_3;
        end
        $$
        delimiter ;

    七、跳出存储过程


      怎么像return一样自如地跳出存储过程呢?

      通过LEAVE实现。 

    DELIMITER $$
    create PROCEDURE test4(IN char_1 CHAR,INOUT char_2 CHAR)
    back:BEGIN
        IF char_1 = 'c' THEN
        SET char_2 = 'e';
        LEAVE back;
        END IF;
        IF char_1 = 'a' THEN
        SET char_2 = 'q';
        LEAVE back;
        END IF;
        IF char_1 = 'a' THEN
        set char_2 = 'r';
        LEAVE back;
        END IF;
    END
    $$
    DELIMITER ;

      实例:

  • 相关阅读:
    第16章 行为型模式—命令模式
    第15章 行为型模式—职责链模式
    第14章 结构型模式—代理模式
    第12章 结构型模式—外观模式
    第11章 结构型模式—装饰模式
    第10章 结构型模式—组合模式
    第9章 结构型模式—桥接模式
    第8章 结构型模式—适配器模式
    Qt中Qstring,char,int,QByteArray之间到转换(转)
    QT:QByteArray和QByteArray、char *(转)
  • 原文地址:https://www.cnblogs.com/zhengbin/p/5517122.html
Copyright © 2011-2022 走看看