数据库-存储过程
文章目录
- 存储过程
- 存储过程创建方式
- 1.创建无参存储过程
- 2.有参存储过程
- 3.案例
- 创建输出参数存储过程
- 存储过程的优缺点
存储过程
存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的sql语句集,经编译创建并保存在数据库中,用户可以通过存储过程的名字并给定参数(需要时)来调用执行。
简单理解,存储过程其实就是一堆sql语句的合并。中间加入一些逻辑控制。
存储过程创建方式
存储过程创建方式:
- 创建无参存储过程
- 创建有参存储过程
1.创建无参存储过程
1.语法格式:
delimiter $$ -- 表示声明一个存储过程的定义方法
create procedure 存储过程名称() -- 声明当前存储过程的名称
begin -- 表示存储过程内部的sql语句声明的开始
# 表示sql执行的操作
end $$ -- 表示声明这个存储过程的定义结束
2.调用存储过程:调用的过程类似java中方法的调用。
call 存储过程名称();
# 简写
call 存储过程名称;
2.有参存储过程
在调用存储过程的时候,需要传递默写参数,给存储过程
语法定义:
delimiter $$
create procedure 存储过程名称(IN 参数名称 参数数据类型)
begin
# sql操作
end $$
delimiter $$
create procedure 存储过程名称(IN age int)
begin
# sql操作
end $$
IN关键字:用来指定当前存储过程可以接收参数列表
参数名称 参数数据类型:在接收参数时,存储过程需要指定参数名称和当前参数的类型。
有参存储过程调用:
call 存储过程名称(实参);
call 存储过程名称(20);
3.案例
1.数据的准备:
# 商品表
CREATE TABLE goods(
gid Int,
name VARCHAR(20),
num INT -- 库存
);
# 订单表
CREATE TABLE orders(
oid INT,
gid INT,
price INT -- 订单价格
);
# 想商品表添加数据
INSERT INTO goods VALUES(1,'奶茶',20);
INSERT INTO goods VALUES(2,'绿茶',100);
INSERT INTO goods VALUES(3,'花茶',25);
2.案例:编写存储过程,查询所有商品数据。
# 需求:编写存储过程,查询所有商品数据。
delimiter $$
create procedure goods_proc()
begin
# sql语句的操作
SELECT * FROM goods;
end $$
3.案例:创建一个存储过程,能够接收一个商品id,并根据id删除商品数据
# 使用当前存储过程
call goods_proc();
call goods_proc;
delimiter $$
create procedure goods_delById_proc(IN goods_id int)
begin
delete from goods where gid = goods_id;
end $$
call goods_delById_proc(2);
创建输出参数存储过程
IN:表示接收传递给存储过程的数据
OUT:表示被修饰的参数返回数据给调用者
delimiter $$
create procedure 存储过程名称(
IN 参数名称1 参数数据类型1,
IN 参数名称2 参数数据类型2,
IN 参数名称3 参数数据类型3
...
OUT 参数名称1 参数数据类型1
OUT 参数名称2 参数数据类型2
...)
begin
# sql操作
# 设置参数值(操作:传递参数,输出参数)
set @参数名称 = 值;
# 返回变量的值
select @参数名称;
end $$
语法:
1.如果存储过程有多个参数,使用逗号分隔
2.set用来设置变量的值,需select用来返回变量的值
3.存储过程内部访问变量,需要使用@作为变量的修饰进行访问
案例:
# 复杂的存储过程
delimiter $$
create procedure orders_proc (
in o_oid int,
in o_gid int,
in o_price int,
out out_num int
)
begin
insert into orders values (o_oid,o_gid,o_price);
-- 给输出变量out_num赋值(10)
set @out_num = 10;
-- 将参数返回
select @out_num;
end $$;
call orders_proc(1, 1, 100, @out_num);