自定义函数和存储过程

为什么使用自定义函数

自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由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] <过程名>
posted @ 2020-10-21 17:10  striver-sc  阅读(367)  评论(0编辑  收藏  举报