MySQL存储过程(MySQL5以上的版本才支持)

本文围绕MySQL存储过程展开,介绍其概念,它是为后续使用保存的多条语句集合,具有简单、安全、高性能的特点。还阐述了存储过程的执行、创建、删除、使用参数及检查等操作,如执行用CALL语句,创建给出实例等。

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

概念

大多数的SQL语句都是针对对单表或多表的单条语句
存储过程:
为了以后的使用而保存的一条或多条MySQL语句的集合。可以理解为批处理文件,但其作用不仅限于批处理

使用理由:
1.通过把处理封装在容易使用的单元中,简化复杂的操作。
2.由于不要求反复建立一系列处理步骤,这保证了数据的完整性
3.简化对变动的处理
4.提高性能
5.存在一些只能用在单个请求中的MySQL特性,存储过程可以使用它们来编写功能更强更灵活的代码
六个字概括就是简单,安全,高性能。

存储过程执行

MySQL称存储过程的执行为调用,语句为CALL。
CALL接受存储过程的名字以及需要传递给它的任意参数
例:

CALL copyDevGroup(@srcGroupName,
					@dstGroupName,
					@dstGroupDesc);

执行名为productpricing的存储过程,计算并返回三个变量。
调用必须以@开始

存储过程创建

直接看个实例:

DROP PROCEDURE IF EXISTS `copyDevGroup`; --检查是否存在copy存储过程,如果存在就删除

CREATE DEFINER = `root`@`%` PROCEDURE `copyDevGroup`(srcGroupName varchar(64),dstGroupName varchar(64),dstGroupDesc varchar(64)) --创建一个名为copyDevGroup的存储过程并定义它的参数和权限
body:BEGIN --此处开始至END;结束就是存储过程的定义
    /*
     * 复制整个设备组
     */
    DECLARE totalInst int DEFAULT 1; 
		/*定义变量totalInst 默认值为1*/
    
    IF IFNULL(srcGroupName,'') = '' OR IFNULL(dstGroupName,'')='' OR IFNULL(dstGroupDesc,'') = ''
    THEN LEAVE body;
    END IF;
    
    IF EXISTS (SELECT * FROM dev_group WHERE TAG_NAME = dstGroupName)
    THEN LEAVE body;
    END IF;
    
    #先插入目标设备组
    INSERT INTO dev_group (
    TAG_NAME,      DESCRIPTION, LOCATION_ID, SUB_SYSTEM, REGION_ID, PGROUP_TAG_NAME, IS_SUMMARY, SUMMARY_VALUE, SUMMARY_STATUS, GROUP_TAG)
    SELECT
    dstGroupName, dstGroupDesc, LOCATION_ID, SUB_SYSTEM, REGION_ID, PGROUP_TAG_NAME, IS_SUMMARY, SUMMARY_VALUE, SUMMARY_STATUS, GROUP_TAG
    FROM dev_group WHERE TAG_NAME = srcGroupName;  --这是参数的使用,结果返回给srcGroupName变量
    
    SELECT count(*) INTO totalInst FROM dev_info WHERE TAG_NAME LIKE '%Gcp%';
    SET totalInst = totalInst + 1;
    #复制设备
    INSERT INTO dev_info(
    TAG_NAME,                           DESCRIPTION,                 LOCATION_ID, SUB_SYSTEM, GROUP_TAG_NAME, VOL_LEVEL_ID, DEV_TYPE, GRAY, CONTRAST, QCOLOR, VALUE, STATUS, NODE_NO1, NODE_NO2, NODE_NO3, NODE_NO4, NODE_NO5, NODE_NO6, NODE_NO7, NODE_NO8, NODE_NO9, NODE_NO10, REGION_ID, OPT_HANDOVER_GROUP, IS_SUMMARY, SUMMARY_VALUE, SUMMARY_STATUS, DEV_TP_NAME)  SELECT      
    concat(TAG_NAME,'Gcp',totalInst), concat(DESCRIPTION,'Gcp'), LOCATION_ID, SUB_SYSTEM, dstGroupName,   VOL_LEVEL_ID, DEV_TYPE, GRAY, CONTRAST, QCOLOR, VALUE, STATUS, NODE_NO1, NODE_NO2, NODE_NO3, NODE_NO4, NODE_NO5, NODE_NO6, NODE_NO7, NODE_NO8, NODE_NO9, NODE_NO10, REGION_ID, OPT_HANDOVER_GROUP, IS_SUMMARY, SUMMARY_VALUE, SUMMARY_STATUS, DEV_TP_NAME
    FROM dev_info  
    WHERE 
    dev_info.GROUP_TAG_NAME = srcGroupName ;--结果返回给srcGroupName变量
    
END;

删除存储过程

DROP PROCEDURE copyDevGroup;

删除不存在的存储过程会报错
在这里插入图片描述
如果想不报错可使用DROP PROCEDURE IF EXISTS;
在这里插入图片描述

使用参数

变量:内存中一个特定的位置,用来临时存储数据
创建的copyDevGroup存储过程并不显示结果,而是把结果返回给你指定的变量,实例注释上也注明了。

 SELECT
    dstGroupName, dstGroupDesc, LOCATION_ID, SUB_SYSTEM, REGION_ID, PGROUP_TAG_NAME, IS_SUMMARY, SUMMARY_VALUE, SUMMARY_STATUS, GROUP_TAG
    FROM dev_group WHERE TAG_NAME = srcGroupName;  --这是参数的使用,结果返回给srcGroupName变量

上面的实例一共引入了三个参数srcGroupName varchar(64),dstGroupName varchar(64),dstGroupDesc varchar(64)

有很多参数,实际可以使用时再研究。

检查存储过程

实例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值