zoukankan      html  css  js  c++  java
  • 自定义函数和存储过程

    为什么使用自定义函数

    自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由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] <过程名>
    
  • 相关阅读:
    VS 2008潜在强大的功能:提取EXE文件中的ICO等资源
    园友们注意:淘宝网上QQ会员 4钻 3元 等都为骗子行为
    Comet Async Process Request Handler
    WCF(Sender) to MSMQ to WCF(Receiver)
    ASP.NET Web Form GridView DetailsView Query Edit
    WCF NetTcp AsyncQueue Service
    Xml CDATA 序列化
    Sync Invoke Remoting Async Invoke
    .Net 4.0 Remoting ConcurrentQueue
    Socket Async Receive Data to LinkedList Buffer (telnet proxy server)
  • 原文地址:https://www.cnblogs.com/striver20/p/13853497.html
Copyright © 2011-2022 走看看