一、SQL 存储过程概述
- 存储过程和函数是存储在服务器端的、可以有输入及输出参数的、用来执行某个功能的 SQL命名块、是数据库中的对象,SQL 命名块可以被客户端应用程序多次调用,它具有模块化、可重用、易扩展、易维护的特点。
- 存储过程经编译创建并保存在数据库中,用户可通过指定存储过程的名字和给定参数来调用执行。存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。
也许:存储过程也可以看作是一个"加工厂",它接收"原料"(in参数)然后将这些原料加工处理成"产品"(out/inout参数),再把"产品"交付给"调用者"。
🌐SQL数据存储与函数之间的差别/关系:
- 存储过程的用户在数据库中完成特定的操作或者任务(例如插入、删除等),而函数则用于返回特定的数据;
- 存储过程的声明使用procedure关键字,而函数的声明则使用function关键字;
- 存储过程不需要返回类型,而函数则必须要返回类型;
- 存储过程可以作为独立的PL-SQL执行,而函数则不能作为独立的PL-SQL执行,必须作为表达式的一部分;
- 存储过程只能通过out和in/out来返回值,而函数除了可以使用out和in/out以外,还可以使用return来返回值,而且函数中必须要有return子句;
- SQL语句(DML或者SELECT)中不可用调用存储过程,而函数可以;
- 执行方式略有不同,存储过程的执行方式有两种(使用execute,使用begin和end),函数除了存储过程的两种方式外,还可以作为表达式使用(例如放在select中)。
🐾使用场合:
(1)如果需要多个返回值或者不返回值,则使用存储过程;如果只需要返回一个值,就使用函数;
(2)存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值;
(3)可以在SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程。
故:如果只有一个返回值,则使用函数;否则,使用存储过程。
二、创建存储过程 create procedure
语法:
创建:
create procedure 存储过程名称(
in 参数名称1 参数数据类型,
out 参数名称2 参数数据类型,
inout 参数名称3 参数数据类型
)
begin
————SQL语句
end;
调用
call 存储过程名称(参数1,@参数名称2) # in和out
set @参数名称2 = X;
call 存储过程名称(@参数名称2); #inout
select @参数名称2;
查看
show create procedure 存储过程名称;
删除
drop procedure if exists 存储过程名称;
1、in out inout 具体详解
类型 | 含义 |
---|---|
in | 作为输入,调用时需要传入值 |
out | 作为输出,该参数作为返回值 |
inout | 既可以输入参数,也可以输出参数 |
2、案例
(1)in:
-- 创建一个存储过程,参数为in
create procedure test(in i int)
begin
select i; -- 返回结果i,i=1
set i=2;
select i; -- 返回结果i,i=2
end
-- 调用存储过程test,并传入一个参数i=1
set @i = 1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=1
-- 由以上代码可知当存储过程的参数为in时,会传入变量的值,并且存储过程内部的赋值不会影响到外部传入的变量
(2)out:
-- 创建一个存储过程,参数为out
create procedure test(out i int)
begin
select i; -- 返回结果i,i=Null
set i=2;
select i; -- 返回结果i,i=2
end
-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=2
-- 由以上代码可知当存储过程的参数为out时,变量的值不会被传入,并且存储过程内部的赋值运算可以影响到外部传入的变量
inout:
-- 创建一个存储过程,参数为inout
create procedure test(inout i int)
begin
select i; -- 返回结果i,i=1
set i=2;
select i; -- 返回结果i,i=2
end
-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test6(@i);
select @i; -- 返回结果i,i=2
-- 由以上代码可知当存储过程的参数为out时,会传入变量的值,并且存储过程内部的赋值运算可以影响到外部传入的变量