码迷,mamicode.com
首页 > 数据库 > 详细

mysql 存储过程与存储函数

时间:2020-06-29 17:11:30      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:str   条件   turn   from   family   function   区别   意义   有趣的   

1  存储过程

存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。

2. 存储过程语法

2.1  创建

CREATE PROCEDURE `findCont`(IN `id` int,OUT `contNo` int)
BEGIN

SELECT CONT_NO into contNo FROM bs_cont WHERE id = `id` ; -- 分号要加
END

语法: CREATE PROCEDURE sp_name(定义输入输出参数) [ 存储特性 ]  BEGIN SQL语句;  END

IN 表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出的参数。sp_name为存储过程的名字。

如果此存储过程没有任何输入输出,其实就没什么意义了,但是sp_name()的括号不能省略。

注意:

1. 先定义名称,在定义类型  ( IN `id` int)。

2. 给出参变量赋值要用 into

查看刚才创建的存储过程。

 SHOW PROCEDURE STATUS LIKE ‘g%‘;

 

下面是调用存储过程。对于存储过程提供的临时变量而言,MySQL规定要加上@开头。

  1. #study 是当前数据库名称
  2. CALL study.findCont(1,@contNo);
  3. SELECT @contNo;
     
     
     

    1  存储过程

    存储函数与存储过程本质上是一样的,都是封装一系列SQL语句,简化调用。我们自己编写的存储函数可以像MySQL函数那样自由的被调用。

    2. 存储过程语法

    2.1  创建 (类型 1 和类型2)

    CREATE FUNCTION getStuNameById(stuId INT)  -- 默认是IN,但是不能写上去。stuId视为输入的临时变量
    RETURNS VARCHAR(255)   -- 指明返回值类型
    RETURN  (SELECT name FROM t_student WHERE id = stuId); //  -- 指明SQL语句,并使用结束标记。注意分号位置
    CREATE DEFINER=`vx`@`%` FUNCTION `calInvoiceAmountForRe`(sourceType VARCHAR(20),sourceId BIGINT) RETURNS decimal(12,2)
    begin
    -- 定义两个变量
    declare invocieAmountRe decimal(13,2);  
    declare invocieAmountAr decimal(13,2); 
    -- 来自于实收的时候:检查sourece_id对应的实收已经开票的金额合计
    select  sum(a.amount_invoice) from fin_invoice_detail a inner join fin_invoice b
    on a.INVOICE_NO = b.INVOICE_NO
    where b.STATUS <> 5 and b.is_del =0 and a.type is null 
    and a.SOURCE_ID = sourceId and a.SOURCE_TYPE = sourceType
    group by a.SOURCE_TYPE,a.SOURCE_ID into invocieAmountRe;
    
    
    --来自于实收的时候:检查sourece_id对应的实收已经开票的金额
    select  sum(a.amount_invoice) from fin_invoice_detail a inner join fin_invoice b
    on a.INVOICE_NO = b.INVOICE_NO
    where b.STATUS <> 5 and b.is_del =0 and a.type is null 
    and a.SOURCE_ID in (select charge_detail_id from fin_received_charge_relate where id = sourceId )  and a.SOURCE_TYPE = AR
    group by a.SOURCE_TYPE,a.SOURCE_ID into invocieAmountAr;
    
       
    return IFNULL(invocieAmountRe,0) +IFNULL(invocieAmountAr,0);
    end

     

    使用存储函数。

    SELECT getStuNameById(1);


    注意:

    1. 在RETURN 语句后面,有趣的是,分号在SQL语句的外面。如果不加分号,查询结果居然查询出两条记录,很奇怪。

    2. 2给出参变量赋值要用 into。

     

    2、存储函数和存储过程的区别
    存储函数    存储过程
    不能拥有输出参数    可以拥有输出参数
    可以直接调用存储函数,不需要call语句 需要call语句调用存储过程
    必须包含一条return语句     不允许包含return语句

     3.   从上述存储函数的写法上来看,存储函数有一定的缺点。首先与存储过程一样,只能返回一条结果记录。另外就是存储函数只能指明一列数据作为结果,而存储过程能够指明多列数据作为结果。

mysql 存储过程与存储函数

标签:str   条件   turn   from   family   function   区别   意义   有趣的   

原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/13208727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!