当前位置: 首页 > MySQL数据库

mysql存储过程的参数类型具体是哪些

时间:2026-01-28 12:53:32

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

存储过程(Stored Procedure):

  一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点(为什么要用存储过程?):

  ①将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用

  ②批量处理:SQL+循环,减少流量,也就是“跑批”

  ③统一接口,确保数据的安全

相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少。

一、存储过程的创建和调用

  >存储过程就是具有名字的一段代码,用来完成一个特定的功能。

  >创建的存储过程保存在数据库的数据字典中。

1、创建存储过程

CREATE    [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]])    [characteristic ...] routine_bodyproc_parameter:    [ IN | OUT | INOUT ] param_name typecharacteristic:    COMMENT 'string'  | LANGUAGE SQL  | [NOT] DETERMINISTIC  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  | SQL SECURITY { DEFINER | INVOKER }routine_body:  Valid SQL routine statement[begin_label:] BEGIN  [statement_list]    ……END [end_label]

#创建数据库,备份数据表用于示例操作

mysql> create database db1;mysql> use db1;    mysql> create table PLAYERS as select * from TENNIS.PLAYERS;mysql> create table MATCHES  as select * from TENNIS.MATCHES;

示例:创建一个存储过程,删除给定球员参加的所有比赛

mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)    -> BEGIN    ->   DELETE FROM MATCHES    ->    WHERE playerno = p_playerno;    -> END$$Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;  #将语句的结束符号恢复为分号

解析:

  默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀;

  在定义过程时,使用DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个$$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。

2、调用存储过程:call sp_name[(传参)];

mysql> select * from MATCHES;+---------+--------+----------+-----+------+| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |+---------+--------+----------+-----+------+|       1 |      1 |        6 |   3 |    1 ||       7 |      1 |       57 |   3 |    0 ||       8 |      1 |        8 |   0 |    3 ||       9 |      2 |       27 |   3 |    2 ||      11 |      2 |      112 |   2 |    3 |+---------+--------+----------+-----+------+5 rows in set (0.00 sec)mysql> call delete_matches(57);Query OK, 1 row affected (0.03 sec)mysql> select * from MATCHES;+---------+--------+----------+-----+------+| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |+---------+--------+----------+-----+------+|       1 |      1 |        6 |   3 |    1 ||       8 |      1 |        8 |   0 |    3 ||       9 |      2 |       27 |   3 |    2 ||      11 |      2 |      112 |   2 |    3 |+---------+--------+----------+-----+------+4 rows in set (0.00 sec)

解析:

  在存储过程中设置了需要传参的变量p_playerno,调用存储过程的时候,通过传参将57赋值给p_playerno,然后进行存储过程里的SQL操作。

3、存储过程体

  >存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等

  >过程体格式:以begin开始,以end结束(可嵌套)

BEGIN  BEGIN    BEGIN      statements;     END  ENDEND

注意:每个嵌套块及其中的每条语句,必须以分号结束,表示过程体结束的begin-end块(又叫做复合语句compound statement),则不需要分号。

4、为语句块贴标签

[begin_label:] BEGIN  [statement_list]END [end_label]

例如:

label1: BEGIN  label2: BEGIN    label3: BEGIN      statements;     END label3 ;  END label2;END label1

标签有两个作用:

  ①增强代码的可读性

  ②在某些语句(例如:leave和iterate语句),需要用到标签

二、存储过程的参数

  存储过程可以有0个或多个参数,用于存储过程的定义。

3种参数类型:

  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素