文章目录
一、简介
在 SQL 中,函数(Function)和存储过程(Stored Procedure)是两种可重复使用的数据库对象,但它们在设计和用途上有一些区别:
-
函数(Function):
- 函数是一种接收参数并返回单个值的数据库对象。
- 函数可以在 SELECT 语句中调用,用于计算和返回单个值。
- 函数通常用于执行特定的计算或操作,并返回结果,比如数学运算、字符串操作等。
- 函数可以被嵌套调用,也可以在其他查询中使用。
- 函数不能包含数据操作语句(如 INSERT、UPDATE、DELETE)。insert updata delete
-
存储过程(Stored Procedure):
- 存储过程是一组预编译的 SQL 语句集合,可接受参数并执行特定任务。
- 存储过程可以包含各种 SQL 语句,包括数据操作语句(如 INSERT、UPDATE、DELETE)。
- 存储过程可以执行一系列操作,如数据操作、流程控制、逻辑判断等。
- 存储过程通常用于执行复杂的业务逻辑、数据操作和流程控制。
- 存储过程可以返回多个结果集或输出参数。
总的来说,函数主要用于计算和返回单个值,而存储过程则更适合执行复杂的逻辑操作和数据处理。选择使用函数还是存储过程取决于具体的需求和场景。
二、函数
1.格式
sql
delimiter 符号 # 自定义sql函数结束符号, 因为我们sql语句就是分号结束,一旦默认是分号结束,sql语句中运行到分号就会终止这个程序
create function 函数名 returns 返回类型
begin
函数体
return 返回值
end 符号
delimiter;
sql
delimiter try #
create FUNCTION nb1() returns INT
begin
return (select s_id from student where class = 95032);
end try
delimiter;
# 查看return 函数结果
select nb1();
2.带参数的函数
sql
delimiter 符号 # 自定义sql函数结束符号, 因为我们sql语句就是分号结束,一旦默认是分号结束,sql语句中运行到分号就会终止这个程序
create function 函数名(参数名 数据类型(n)) returns 返回类型
begin
函数体
return 返回值
end 符号
delimiter;
3.定义变量
set @变量名 = 数值;
3.如何查询变量值
select @变量名;
sql
delimiter 小杨
create function nb2(str char(5)) returns INT
begin
return (select kt_id from course where k_name = str);
end 小杨
delimiter ;
select nb2("小杨");
select nb2("操作系统");
set @name = '操作系统';
select @name;
select nb2(@name);
三、储存过程
1.格式
sql
delimiter 符号
create procedure 储存过程名称()
begin
储存过程(查询语句的集合)
end 符号
delimiter ;
sql
delimiter $$
CREATE procedure np1()
BEGIN
select * from course;
select * from student;
end $$
delimiter;
2.参数
sql
delimiter 符号
create procedure 储存过程名称([in/out] 参数名 参数类型)
begin
储存过程(查询语句的集合)
end 符号
delimiter ;
3.in的接入参数
sql
delimiter !
create procedure np2(in number int)
begin
select * from course where kt_id = number;
select * from teacher where t_id = number;
end !
delimiter;
call np2(825);
set @number = 825;
call np2(@number);
----
4.out的接入参数
而且out只能用形参传入,不能实参传入
sql
delimiter !
create procedure np3(out number int)
begin
select number;
set number = 32;
select number;
end !
delimiter;
call np3(825);
set @number = 825;
call np3(@number);
5.in和out区别
在存储过程中,IN
和 OUT
是用来定义参数的关键字,它们在存储过程中的作用有所不同:
-
IN
参数:IN
参数用于向存储过程传递数值,字符串或其他数据类型的值。IN
参数是存储过程的输入参数,即在调用存储过程时传递给存储过程的值。- 存储过程内部可以使用
IN
参数的值,但不能对其进行修改。 IN
参数默认是只读的 ,存储过程执行完后,参数的值不会发生变化。
-
OUT
参数:OUT
参数用于从存储过程中获取返回值或输出参数。OUT
参数是存储过程的输出参数,即存储过程执行完后会将结果赋值给OUT
参数。- 存储过程内部可以修改
OUT
参数的值,这个修改后的值会在存储过程执行完后返回给调用者。 OUT
参数可以用来返回存储过程执行的结果、状态信息或其他输出值。
举例说明:
sql
CREATE PROCEDURE GetEmployeeInfo(IN emp_id INT, OUT emp_name VARCHAR(50))
BEGIN
SELECT name INTO emp_name FROM employees WHERE id = emp_id;
END;
在上面的存储过程中,emp_id
是一个 IN
参数,用于传递员工的 ID 值;emp_name
是一个 OUT
参数,用于存储员工的姓名,这个姓名会在存储过程执行完后返回给调用者。
总的来说,IN
参数用于传递输入值给存储过程,而 OUT
参数用于从存储过程中获取返回值。
四、应用场景
函数和存储过程在 SQL 中有各自的使用场景,下面列举了它们常见的应用场景:
函数的使用场景:
- 计算字段值:函数可以用于计算和返回特定字段的值,比如计算两个数的和、字符串的长度等。
- 数据转换:函数可以用于数据转换,比如日期格式转换、字符串格式化等。
- 约束条件:函数可以用于定义约束条件,确保数据符合特定规则。
- 查询优化:函数可以用于优化查询,减少重复计算或简化复杂查询。
- 数据加密:函数可以用于数据加密和解密操作。
存储过程的使用场景:
- 复杂业务逻辑:存储过程适合处理复杂的业务逻辑,如订单处理流程、报表生成等。
- 数据操作:存储过程可以包含数据操作语句,用于管理和操作数据库中的数据。
- 事务管理:存储过程可以用于事务管理,确保一系列操作要么全部成功,要么全部失败。
- 权限控制:存储过程可以用于实现权限控制,限制用户对数据库的访问和操作。
- 性能优化:存储过程可以用于优化性能,减少网络通信开销和减少重复代码。
总的来说,函数适合简单的计算和数据转换操作,而存储过程适合处理复杂的业务逻辑和数据操作。在实际应用中,根据具体需求和场景选择合适的对象来实现相应的功能。