自定义函数和存储过程
为什么使用自定义函数
自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由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] <过程名>