• 自定义函数和存储过程


    为什么使用自定义函数

    自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由SQL语句和过程式语句组成的代码片段,并且可以被应用程序和其它SQL语句调用。但是,自定义函数和存储过程之间存在几点区别:

    • 自定义函数不能拥有输出参数,这是因为自定义函数自身就是输出函数;而存储过程可以拥有输出函数。
    • 自定义函数中必须包含RETURN语句,而这条特殊的SQL语句不允许包含于存储过程中。
    • 可以直接对自定义函数进行调用而不需要使用CALL语句,而存储过程的调用需要使用CALL语句。

    创建并使用自定义函数

    CREATE FUNCTION <函数名> ([<参数1> <类型1> [,<参数2> <类型2>]]...)
    RETURNS <类型>
    <函数主体>
    
    CREATE FUNCTION StuNameById()
    RETURNS VARCHAR(45)
    RETURN
    (select name from tb_student_info where id=1);
    

    调用自定义函数

    SELECT <自定义函数名> ([<参数> [,...]])
    
    #示例
    SELECT StuNameById();
    

    删除自定义函数

    DROP FUNCTION [IF EXISTS] <自定义函数名>
    
    #示例
    DROP FUNCTION StuNameById;
    

    为什么要使用存储过程

    一个存储过程是一个可编程的函数,它在数据库中创建并保存,一般由SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的特定功能时,存储过程很合适。

    存储过程的优点:

    • 封装性
    • 可增强SQL语句的功能和活力
    • 可减少网络流量
    • 高性能
    • 提高数据库的安全性和数据的完整性

    结构控制语句

    声明变量

    局部变量

    在存储过程体中可以声明局部变量,可以存放产生的临时结果。

    局部变量与全局变量相对应,是局部范围内有效的变量。

    DECLARE <变量名> [,...] <类型> [DEFAULT <默认值>]
    
    set语句

    变量声明后,可以使用set语句为局部变量赋值

    SET <变量名1>=<表达式1> [,<变量名2>=<表达式2>]...
    
    SELECT ...INTO语句

    可以使用SELECT ...INTO 语句把选定列的值直接存储到局部变量中,存储过程体中的SELECT ...INTO只能返回一行数据。

    SELECT <列名> [,...] INTO <变量名> [,...] <其他>
    
    条件控制语句

    可以再存储过程体中使用以下控制语句流程的过程式SQL语句

    IF <判断条件> THEN <语句>
    [ELSEIF <判断条件> THEN <语句>]
    [ELSE 语句]
    END IF
    
    条件判断语句CASE
    CASE <参数>
    WHEN <参数> THEN <语句>
    [WHEN <参数> THEN<语句>]
    [ELSE 语句]
    ENDCASE
    
    循环控制参数

    循环语句LOOP

    <标签> LOOP
    <语句>
    END LOOP [标签]
    

    循环语句WHILE

    <标签> WHILE <判断条件> DO
    <语句>
    END WHILE<标签>
    

    循环语句REPEAT

    <标签> REPEAT
    <语句>
    UNTIL <判断条件>
    END REPEAT <标签>
    

    创建存储过程

    CREATE PROCEDURE <过程名> ([过程参数 [,...] ] ) <过程体>
    [过程参数[,...]] 格式
    [IN | OUT | INOUT] <参数名> <类型>
    

    创建不带参数的存储过程

    DELIMITER //
    CREATE PROCEDURE ShowStuScore()
    BEGIN
    SELECT * FROM tb_students_score;
    END //
    

    调用该存储过程

    DELIMITER ;
    CALL ShowStuScore();
    

    创建带参数的存储过程

    DELIMITER //
    CREATE PROCEDURE GetScoreByStu
    (IN name VARCHAR(30))
    BEGIN
    SELECT student_score FROM tb_students_score
    WHERE student_name=name;
    END //
    

    调用该存储过程的SQL语句

    DELIMITER ;
    CALL GetScoreByStu('Green');
    

    修改存储过程

    ALTER PROCEDURE <过程名> [<特征> ....]
    

    删除存储过程

    DROP {PROCEDURE | FUNCTION} [IF EXISTS] <过程名>
    
  • 相关阅读:
    JavaScript对象
    JavaScript基础
    MySQL总结
    前端的基础知识汇总
    反射,面对对象高阶
    django中的认证登陆与用户的创建
    django的cookie和session
    ajax的json包含于xml的区别
    django的分页系统
    django的orm简签
  • 原文地址:https://www.cnblogs.com/striver20/p/13853497.html
Copyright © 2020-2023  润新知