优点:
<1>存储过程一旦调试完成后,就可以稳定运行,(前提是,业务需求要相对稳定,没有变化)
<2>存储过程减少业务系统与数据库的交互,降低耦合,数据库交互更加快捷(应用服务器,与 数据库服务器不在同一个地区)
缺点:
<1> 在互联网行业中,大量使用MySQL,MySQL的存储过程与Oracle的相比较弱,所以较少使用,并且互联网行业需求变化较快也是原因之一
<2> 尽量在简单的逻辑中使用,存储过程移植十分困难,数据库集群环境,保证各个库之间存储 过程变更一致也十分困难。
<3> 阿里的代码规范里也提出了禁止使用存储过程,存储过程维护起来的确麻烦;
1) 数据准备
创建商品表 与 订单表
# 商品表 CREATE TABLE goods( gid INT, NAME VARCHAR(20), num INT -- 库存 ); #订单表 CREATE TABLE orders( oid INT, gid INT, price INT -- 订单价格 ); # 向商品表中添加3条数据 INSERT INTO goods VALUES(1,'奶茶',20); INSERT INTO goods VALUES(2,'绿茶',100); INSERT INTO goods VALUES(3,'花茶',25)
2) 创建简单的存储过程
语法格式
DELIMITER $$ -- 声明语句结束符,可以自定义 一般使用$$ CREATE PROCEDURE 过程名称() -- 声明存储过程 BEGIN -- 开始编写存储过程 -- 要执行的操作 END $$ -- 存储过程结束
需求: 编写存储过程, 查询所有商品数据
DELIMITER $$ CREATE PROCEDURE goods_proc() BEGIN select * from goods; END $$
3) 调用存储过程
语法格式
call 存储过程名
-- 调用存储过程 查询goods表所有数据 call goods_proc;
1) IN 输入参数:表示调用者向存储过程传入值
CREATE PROCEDURE 存储过程名称(IN 参数名 参数类型)
2) 创建接收参数的存储过程
需求: 接收一个商品id, 根据id删除数据
DELIMITER $$ CREATE PROCEDURE goods_proc02(IN goods_id INT) BEGIN DELETE FROM goods WHERE gid = goods_id ; END $$
3) 调用存储过程 传递参数
# 删除 id为2的商品 CALL goods_proc02(2)
1) 变量赋值
SET @变量名=值
2) OUT 输出参数:表示存储过程向调用者传出值
OUT 变量名 数据类型
3) 创建存储过程
需求: 向订单表 插入一条数据, 返回1,表示插入成功
# 创建存储过程 接收参数插入数据, 并返回受影响的行数 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); -- 设置 num的值为 1 SET @out_num = 1; -- 返回 out_num的值 SELECT @out_num; END $$
4) 调用存储过程
# 调用存储过程插入数据,获取返回值 CALL orders_proc(1,2,30,@out_num);