zoukankan      html  css  js  c++  java
  • mysql-过程与函数

    一、过程与函数简介

      过程与函数是命名的PL/SQL块(也是用户的方案对象),被编译后存储在数据库中,以备执行。因此,其他PL/SQL块可以按名称来使用他们。所以可以将商业逻辑、企业规划写成函数或过程保存到数据库中,以便共享。

      过程和函数统称为PL/SQL子程序,他们是被命名的PL、SQL块,均存储在数据库中,并通过输入、输出参数或输入、输出参数与调用者交换信息。

      过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据。

    二、存储简介

      存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合,可见其视为批文件。

      使用存储过程的原因:

      1、通过把处理封装在容易使用的单元中,简化复杂的操作。

      2、由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码相同。

      3、简化对变动的管理,如果表名、列名业务逻辑有变化,只需要更改存储过程的代码,使用它的人员甚至不需要知道这些变化。

      4、提高性能。使用存储过程比使用单独的sql语句要快

      5、存储过程的使用可以使编写代码更灵活。

      使用存储过程三个好处:简单、安全、高性能

    三、存储过程概述

      

    注:

      (1)、DELIMITER和//DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以‘;’为分隔符,如果我们没有声明分隔符,那么编译器会把存储过程当成sql语句进行处理,则存储过程的编译过程会报错,所以要实现用DELIMITER关键字申明当前段分隔符,这样Mysql才会将;当做存储过程中的代码,不会这行这些代码,用完了之后要将分隔符还原。

      (2)、存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型为int,如果有多个参数用“,”隔开。

      (3)、过程体的开始和结束用begin和end进行标识。

      (4)、后面的delimiter必须空格之后才能加分号

    四、MySQL存储过程参数IN、OUT

      mysql存储过程的参数用在存储过程的定义,共有三中参数类型,IN,OUT,INOUT,形式如:

      CREATE PROCEDURE([[IN|OUT|INOUT] 参数名  数据类型...])

      IN  输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。

      OUT    输出参数:该值可以在存储过程内部被改变并返回

      INOUT输入输出参数:调用时指定,并且可被改变和返回

     存储过程 p_1:

    drop procedure if exists p_1;
    delimiter //
    create procedure p_1(
    in_num int,
    in_flag bool,
    in_rate float(10,2),
    out out_sum float(10,2)
    )
    begin
        set @sum:=0;
        select sum(item_price*quantity) into @sum
        from orderitems o
        where order_num=in_num;
        if in_flag then
            set @sum:=@sum*in_rate+@sum;
        end if;
        set out_sum:=@sum; 
        
    end //
    delimiter ;

    调用p_1:

      

    set @out:=0;
    call p_1(20006,1,0.1,@out);
    select @out;

     五、存储过程的各种操作

      1、mysql存储过程调用

        用call和过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。

      2、mysql存储过程的修改

        ALTER PROCEDURE

        更改用CREATE PROCEDURE建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

      3、mysql存储过程的删除

        删除一个存储过程比较简单,和删除表一样;

        drop procedure;

        从mysql的表格中删除一个或多个存储过程。

    六、存储过程的控制语句

      1、if-then-else

        if(expr1,expr2,expr3):expr1为真,则返回expr2,否则返回expr3

    select
    if(vend_id>1002,'质量好','质量差'),vend_id
    from products;

        ifnull(expr1,expr2):expr1为空,则返回expr2,否则返回expr1

    select 
    ifnull (cust_email,'邮箱为空') ,cust_email
    from customers;

        nullif(expr1,expr2):如果expr1和expr2相等,返回空,否则返回expr1.

    select 
    nullif (1,1)

      2、case语句

        两种case方法:第一种限定了case的字段,改变字段的值来when不同的情况

               第二种不限定case的字段,when的时候加上不同的字段,来when不同字段

        第一种:

    select f_name,
    case f_name
        when 'JACK' then ''
        when 'JOHN' then ''
    end 说明
    from father;*/

        第二种:

    select f_name,
    case 
        when f_name='JACK' then ''
        when f_name='JOHN' then ''
    end 说明
    from father;

      3、while...end while

      过程:

    drop procedure if exists p_2;
    delimiter //
    create procedure p_2(
    )
    begin
        set @i:=0;
        while @i<10 do
            select @i;
            set @i:=@i+1;
        end while;
    end //
    delimiter ;

      调用

    call p_2();

      4、repeat... end repeat:  (相当于do   while)

    drop procedure if exists p_3;
    delimiter //
    create procedure p_3(
    )
    begin
        set @i:=0;
        repeat
            select @i;
            set @i=@i+1;
            until @i>9
        end repeat;
    end //
    delimiter ;
    call p_3();

      5、loop......end loop

      loop循环不需要初始条件,这点和while循环相似,同时和repeat循环一样不需要结束条件,leave语句的意义是离开循环

    drop procedure if exists p_4;
    delimiter //
    create procedure p_4(
    )
    begin
        set @i:=0;
        loop1:loop
            select @i;
            set @i=@i+1;
            if  @i>9 then
                leave loop1;
            end if;
        end loop;
    end //
    delimiter ;
    call p_4();

    六、MYSQL函数

    select f_1(0.1)
    drop function if exists f_1;
    delimiter //
    create function f_1(
        in_rate float(10,2)
    )returns float(10,2)
    begin
        set @sum:=0;
        select sum(item_price*quantity)*in_rate into @sum
        from orderitems;
        return @sum;
    end //
    delimiter ;

    删除函数:drop function 函数名

    七、函数和过程的区别

      1、函数没有out参数,它通过returns进行返回;过程有out参数

      2、函数需要通过select调用,过程通过call调用

  • 相关阅读:
    linux命令行下命令参数前的一横(-)和两横(--)的区别
    sql的集合操作
    二叉树的遍历
    linux网络编程中阻塞和非阻塞socket的区别
    Python 信号量
    python中文件的复制
    Linux网络服务器epoll模型的socket通讯的实现(一)
    Linux启动提示“unexpected inconsistency;RUN fsck MANUALLY”
    Linux用户级线程和内核级线程区别
    nodejs的cs模式聊天客户端和服务器实现
  • 原文地址:https://www.cnblogs.com/television/p/8365154.html
Copyright © 2011-2022 走看看