美文网首页
存储程序--存储函数

存储程序--存储函数

作者: wpf_register | 来源:发表于2019-09-29 09:38 被阅读0次

    原文链接-定义变量
    原文链接-存储函数
    原文链接-存储过程
    原文链接-游标简介
    原文链接-触发器和事件简介

    存储例程是存储程序的一种,本质上也是封装了一些可执行的语句,只不过它的调用的方式是需要手动调用的。

    存储函数

    创建

    存储函数是一种函数,在函数中可以执行命令语句。
    MySQL中存储函数的定义语句如下:

    Create Function  存储函数名称([参数列表])
    Returns 返回值类型
    Begin
        函数体内容       
    End
    

    定义一个根据部门求工资总和的函数

    delimiter &
    Create Function sum_salary( deptID int)
    Returns Double
    BEGIN
        RETURN (SELECT SUM(salary) FROM employee WHERE dept_id = deptID);
    END &
    delimiter ;
    
    调用
    SELECT sum_salary(1);
    
    查看/删除
    Show Create Function函数名
    Drop Function 函数名
    
    在函数体中定义变量

    在命令行中可以不用声明就给变量赋值(即SET语句声明),但在函数体中使用变量必须先声明变量

    Declare 变量名 数据类型 [default 默认值]
    //特别注意,函数体中变量不允许加@ 前缀,先声明,再使用。
    
     delimiter $;
     CREATE FUNCTION var_demo()
     RETURNS INT
     BEGIN
         DECLARE c INT;
         SET c = 5;
         RETURN c;
     END $
     delimiter ;
    
    
    //也可以声明默认值
    delimiter $
    CREATE FUNCTION var_default_demo()
    RETURNS INT
     BEGIN
         DECLARE c INT DEFAULT 1;
         RETURN c;
     END $
     delimiter ;
    
    //一般将查询结果赋值
    CREATE FUNCTION avg_score(s VARCHAR(100)) 
    RETURNS DOUBLE
    BEGIN
        DECLARE a DOUBLE;
        SET a = (SELECT AVG(score) FROM student_score WHERE subject = s);
        return a;
    END
    

    注意:

    • 参数名不要和函数体语句中其他的变量名、命令语句的标识符冲突。
    • 函数参数不可以指定默认值,我们在调用函数的时候,必须显式的指定所有的参数,并且参数类型也一定要匹配
    IF 语句
    IF 布尔表达式 THEN 
        处理语句
    [ELSEIF 布尔表达式 THEN
        处理语句]
    [ELSE 
        处理语句]    
    END IF;
    

    示例

     delimiter $
     CREATE FUNCTION condition_demo(i INT)
     RETURNS VARCHAR(10)
     BEGIN
         DECLARE result VARCHAR(10);
         IF i = 1 THEN
             SET result = '结果是1';
         ELSEIF i = 2 THEN
             SET result = '结果是2';
         ELSEIF i = 3 THEN
             SET result = '结果是3';
         ELSE
             SET result = '非法参数';
         END IF;
         RETURN result;
     END $
     delimiter ;
    
    循环语句
    WHILE 布尔表达式 DO
        循环语句
    END WHILE;
    
    
    REPEAT
        循环语句
    UNTIL 布尔表达式 END REPEAT;
    
    
    循环标记:LOOP
        循环语句
        LEAVE 循环标记;
    END LOOP 循环标记;
    
     CREATE FUNCTION sum_all(n INT UNSIGNED)
     RETURNS INT
     BEGIN
         DECLARE result INT DEFAULT 0;
         DECLARE i INT DEFAULT 1;
         WHILE i <= n DO
             SET result = result + i;
             SET i = i + 1;
         END WHILE;
         RETURN result;
     END 
    
    CREATE FUNCTION sum_all(n INT UNSIGNED)
    RETURNS INT
    BEGIN
        DECLARE result INT DEFAULT 0;
        DECLARE i INT DEFAULT 1;
        REPEAT 
            SET result = result + i;
            SET i = i + 1;
        UNTIL i <= n END REPEAT;
        RETURN result;
    END
    
    CREATE FUNCTION sum_all(n INT UNSIGNED)
    RETURNS INT
    BEGIN
        DECLARE result INT DEFAULT 0;
        DECLARE i INT DEFAULT 1;
        flag:LOOP  
            IF i > n THEN
                LEAVE flag;
            END IF;
            SET result = result + i;
            SET i = i + 1;
        END LOOP flag;
        RETURN result;
    END
    
    注释

    在函数体内以--开头的语句都算作注释语句,MySQL服务器在执行语句的时候会忽略掉这些注释语句。

    相关文章

      网友评论

          本文标题:存储程序--存储函数

          本文链接:https://www.haomeiwen.com/subject/qtmiuctx.html