MySQL----存储过程(Stored Procedure)

本文深入解析了存储过程的概念、优缺点,以及在MySQL中的创建、调用、查询、修改和删除方法。并详细介绍了存储过程的参数类型,包括IN、OUT和INOUT参数的使用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。是具有名字的一段代码,用来完成一个特定的功能。创建的存储过程保存在数据库的数据字典中

存储过程优缺点

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑
  • 存储过程可以回传值,并可以接受参数
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同
  • 存储过程可以用在数据检验,强制实行商业逻辑等

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程
  • 存储过程的性能调校与撰写,受限于各种数据库系统

创建存储过程

create procedure 存储过程名(int/out/inout 参数名 参数类型,...)
begin
	存储过程体
end

#例子
DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

分隔符

MySQL默认以";“为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原

参数

存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型:

  • IN:参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT:该值可在存储过程内部被改变,并可返回
  • INOUT:调用时指定,并且可被改变和返回

过程体

过程体的开始与结束使用BEGIN与END进行标识。

变量

#声明变量
DECLARE 变量名1[,变量名2...] 数据类型 [默认值];
变量类型

数值类型
数值类型
日期和时间类型日期和时间类型
字符串类型
字符串类型

变量赋值
SET 变量名 = 变量值 [,变量名= 变量值 ...]
用户变量

用户变量一般以@开头
**注意:**滥用用户变量会导致程序难以理解及管理

IN参数例子

DELIMITER //
  CREATE PROCEDURE in_param(IN p_in int)
    BEGIN
    SELECT p_in;
    SET p_in=2;
    SELECT p_in;
    END;
    //
DELIMITER ;

#调用
SET @p_in=1;
CALL in_param(@p_in);
SELECT @p_in;

执行结果:
在这里插入图片描述
以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值

OUT参数例子

#存储过程OUT参数
DELIMITER //
  CREATE PROCEDURE out_param(OUT p_out int)
    BEGIN
      SELECT p_out;
      SET p_out=2;
      SELECT p_out;
    END;
    //
DELIMITER ;

#调用
SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;

执行结果:
在这里插入图片描述

INOUT参数例子

#存储过程INOUT参数
DELIMITER //
  CREATE PROCEDURE inout_param(INOUT p_inout int)
    BEGIN
      SELECT p_inout;
      SET p_inout=2;
      SELECT p_inout;
    END;
    //
DELIMITER ;
#调用
SET @p_inout=1;
CALL inout_param(@p_inout) ;
SELECT @p_inout;

执行结果:
在这里插入图片描述

存储过程的调用

用call和过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数

存储过程的查询

#查询存储过程
SELECT name FROM mysql.proc WHERE db='数据库名';
SELECT routine_name FROM information_schema.routines WHERE routine_schema='数据库名';
SHOW PROCEDURE STATUS WHERE db='数据库名';

#查看存储过程详细信息
SHOW CREATE PROCEDURE 数据库.存储过程名;

存储过程的修改

ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
  • **sp_name:**参数表示存储过程或函数的名称;
  • **characteristic:**参数指定存储函数的特性。
  • **CONTAINS SQL:**表示子程序包含SQL语句,但不包含读或写数据的语句;
  • **NO SQL:**表示子程序中不包含SQL语句;
  • **READS SQL DATA:**表示子程序中包含读数据的语句;
  • **MODIFIES SQL DATA:**表示子程序中包含写数据的语句。
  • **SQL SECURITY { DEFINER | INVOKER }:**指明谁有权限来执行,DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行
  • **COMMENT ‘string’:**是注释信息。

存储过程的删除

# 从MySQL的表格中删除一个或多个存储过程。
DROP PROCEDURE [过程1[,过程2]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值