首页 > 数据库 >MySQL存储过程入门使用

MySQL存储过程入门使用

时间:2023-04-15 09:15:16浏览次数:35  
标签:语句 存储 入门 SQL 参数 MySQL 过程 PROCEDURE

一、存储过程概述

存储过程的英文是 Stored Procedure。它的思想很简单,就是一组经过预先编译的 SQL 语句的封装。
执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。

MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。存储过程与函数不同是没有返回值的。

  • 存储过程优点:
    1、简化操作,提高了sql语句的重用性,减少了开发程序员的压力
    2、减少操作过程中的失误,提高效率
    3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)
    4、减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性

二、创建存储过程

1、存储过程语法

  • 语法:
DELIMITER $

CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
[characteristics ...]
BEGIN
	sql语句1;
	sql语句2;

END $

DELIMITER ;

2、语法分析

1、参数前面的符号的意思

  • IN:当前参数为输入参数,也就是表示入参;

    存储过程只是读取这个参数的值。如果没有定义参数种类,默认就是 IN,表示输入参数。

  • OUT:当前参数为输出参数,也就是表示出参;

    执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了。

  • INOUT:当前参数既可以为输入参数,也可以为输出参数。

2、形参类型可以是 MySQL数据库中的任意类型。

3、characteristics 表示创建存储过程时指定的对存储过程的约束条件,一般无需指定。

4、存储过程体中可以有多条 SQL 语句,如果仅仅一条SQL 语句,则可以省略 BEGIN 和 END

5、需要设置新的结束标记
DELIMITER 新的结束标记,因为MySQL默认的语句结束符号为分号‘;’。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。

存储过程定义完毕之后再使用“DELIMITER ;”恢复默认结束符。

3、代码举例

DELIMITER $$

CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DOUBLE)
	BEGIN
		DECLARE i INT DEFAULT 1; -- 定义变量
		SELECT salary INTO empsalary FROM emps WHERE ename = empname; -- 查询并赋值
	END $$

DELIMITER ;

编写存储过程并不是一件简单的事情,可能存储过程中需要复杂的 SQL 语句。
BEGIN…END:BEGIN…END 中间包含了多个语句,每个语句都以(;)号为结束符。
DECLARE:DECLARE 用来声明变量,使用的位置在于 BEGIN…END 语句中间,而且需要在其他语句使用之前进行变量的声明。
SET:赋值语句,用于对变量进行赋值。
SELECT… INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值。

三、调用存储过程

存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称,例如CALL dbname.procname

1、调用语法

  • 基本语法
CALL 存储过程名(实参列表)
  • 调用in类型参数
CALL sp1('值');
  • 调用out类型参数
SET @name;
CALL sp1(@name);
SELECT @name;

四、存储过程查询、修改、删除

MySQL存储了存储过程和函数的状态信息,用户可以使用SHOW STATUS语句或SHOW CREATE语句来查看,也可直接从系统的information_schema数据库中查询。也可以直接通过navicat这种可视化工具查看。

1、查询

  • 1)使用 show create方式
    语法:
SHOW CREATE {PROCEDURE | FUNCTION} 存储过程名或函数名

-- 例
show create PROCEDURE separatematerial_insert
  • 2)使用 show status方式
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

-- 例
SHOW PROCEDURE STATUS LIKE 'separ%'
  • 3)从information_schema.Routines表中查看存储过程和函数的信息
    MySQL中存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='存储过程或函数的名' [AND ROUTINE_TYPE = {'PROCEDURE|FUNCTION'}];

-- 例
SELECT * FROM information_schema.Routines 
WHERE ROUTINE_NAME='separatematerial_insert' AND ROUTINE_TYPE = 'PROCEDURE'

2、修改

修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特性。使用ALTER语句实现。

ALTER {PROCEDURE | FUNCTION} 存储过程或函数的名 [characteristic ...]

3、修改

DROP {PROCEDURE | FUNCTION} [IF EXISTS] 存储过程或函数的名

-- 例
DROP PROCEDURE IF EXISTS separatematerial_insert;

标签:语句,存储,入门,SQL,参数,MySQL,过程,PROCEDURE
From: https://www.cnblogs.com/Snowclod/p/17320442.html

相关文章

  • 阿里云1+X云计算开发与运维——分布式存储理论
    一,主流存储类型的概述1,主流存储分类按照存储类型可以分为块存储,文件存储,对象存储1、块存储典型设备:磁盘阵列,硬盘主要是将裸磁盘空间映射给主机使用的。使用场景:docker容器、虚拟机远程挂载磁盘存储分配。日志存储。文件存储。2、文件存储典型设备:FTP、NFS服务器为了克......
  • Python入门基础实例讲解——两个数字比大小,并输出最大值
    嗨害大家好鸭!我是小熊猫~今天也是给大家带来干货的一天~pycharm永久激活码可以从这里找到我:输出:print()print()方法用于打印输出,最常见的一个函数。比较运算符>:大于,如果运算符前面的值大于后面的值,则返回True;否则返回False<:小于,如果运算符前面的值小于后面的值,则返回True;否......
  • python分段读取word文件数据到MySQL数据库和Java读取word数据到MySQL数据库
    1、python分段读取word文件数据到MySQL数据库示例:(注:此示例为读取某个文件夹下的所有文件,并对文件后缀名为doc的文件进行读取,并以文件名称为id完成对该word内容的插入。)#导入os模块importos#导入所需库importpymysqlfromdocximportDocument#path定义要获取的......
  • odoo 开发入门教程系列-继承(Inheritance)
    继承(Inheritance)Odoo的一个强大方面是它的模块化。模块专用于业务需求,但模块也可以相互交互。这对于扩展现有模块的功能非常有用。例如,在我们的房地产场景中,我们希望在常规用户视图中直接显示销售人员的财产列表。在介绍特定的Odoo模块继承之前,让我们看看如何更改标准CRUD(创建......
  • mysqlhotcopy
    mysqlhotcopy是一个Perl脚本,最初由TimBunce编写并提供。它使用LOCKTABLES、FLUSHTABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中。.与mysqldump备份不同,m......
  • 使用 Mybatis 对 mysql 查询时间范围
    需求:1.传入开始时间(startTime)和结束时间(endTime),查询effective_time在区间[startTime,endTime]中的数据。Controller中的时间入参用String表示://查询接口,默认查询今年内的数据。@GetMapping(value="/getData")publicList<Demo>selectDemoData(@Req......
  • 运行mysql容器以及通过命令行访问数据库
    运行mysql容器下面命令将创建一个名为mysql-8.0.31的容器,并将容器中的MySQL根密码设置为root。dockerrun--namemysql-8.0.31-p3306:3306-eMYSQL_ROOT_PASSWORD=root-dmysql:8.0.31访问mysqlmysql-h127.0.0.1-P3306-u<username>-p导入sql文件创建数据......
  • Nvidia Tensor Core-MMA PTX编程入门
    1PTX(ParallelThreadExecution)PTX是什么,Nvidia官方描述为alow-levelparallelthreadexecutionvirtualmachineandinstructionsetarchitecture(ISA),直面意思是低级并行线程执行虚拟机和指令集架构。怎么理解其直面意思,有两个方法。一个方法是借鉴LLVM,熟悉LLV......
  • Java接收到MySQL数据库查询出的date类型的数据输出格式不对
    问题查询某条数据,里面有个effective_time字段,数据库里保存的该条数据的effective_time的值是2023-04-13,但是使用postman调用接口,返回的确是2023-04-12T16:00:00.000+00:00,不仅格式不对,而且时间还慢了一天。但是在application.yml中配置数据库连接的时候,确实指定了时区......
  • MySQL学习笔记-索引
    索引索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。无索引的查找:全表扫描(将整张表遍历一遍),性能......