概念
大多数的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)
有很多参数,实际可以使用时再研究。
检查存储过程
实例: