mysql存储过程功能弱问题一直是大家关注的问题,今天讲一下Mysql存储过程无法传递数组类型参数的解决方案。

推荐课程:MySQL教程。

在很多的情况下,在编写存储过程中往往会用到数组,但是mysql中存储过程传入参数并没有可以直接传入数组的方法。在这种情况下我们只能退而求之或者说换个方式以字符串形式传入参数,然后在过程体中把字符串再转成数组?

不过很遗憾告诉你,mysql并没有直接提供把字符串转数组的函数。现在你是不是有种想打人的感觉呢?不过,不用慌,此路不通,咱走另外的路,总有解决方法的。我们可以把传入的字符串截取成多个字符然后传入到临时表中,然后使用游标或者直接关联表过滤数据。这样就可以达到后面预期的效果了。

下面我们以一个例子来具体实践一下:

1、创建数据库,用于实例:CREATE DATABASE huafeng_db;use huafeng_db;DROP TABLE IF EXISTS `huafeng_db`.`t_scores`;DROP TABLE IF EXISTS `huafeng_db`.`t_students`;DROP TABLE IF EXISTS `huafeng_db`.`t_class`;CREATE TABLE `huafeng_db`.`t_class` ( `class_id` int(11) NOT NULL, `class_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`class_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('1', '一年级');INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('2', '二年级');INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('3', '三年级');INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('4', '四年级');INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('5', '五年级');INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('6', '六年级');CREATE TABLE `t_students` ( `student_id` int(11) NOT NULL AUTO_INCREMENT, `student_name` varchar(32) NOT NULL, `sex` int(1) DEFAULT NULL, `seq_no` int(11) DEFAULT NULL, `class_id` int(11) NOT NULL, PRIMARY KEY (`student_id`), KEY `class_id` (`class_id`), CONSTRAINT `t_students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `t_class` (`class_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小红',0,1,'1');INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小青',0,2,'2');INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小明',1,3,'3');INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小兰',0,4,'4');INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小米',1,5,'5');INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小白',1,6,'6');CREATE TABLE `huafeng_db`.`t_scores` ( `score_id` int(11) NOT NULL AUTO_INCREMENT, `course_name` varchar(64) DEFAULT NULL, `score` double(3,2) DEFAULT NULL, `student_id` int(11) DEFAULT NULL, PRIMARY KEY (`score_id`), KEY `student_id` (`student_id`), CONSTRAINT `t_scores_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `t_students` (`student_id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('1', '语文', '90', '1');INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('2', '数学', '97', '1');INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('3', '英语', '95', '1');INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('4', '语文', '92', '2');INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('5', '数学', '100', '2');INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('6', '英语', '98', '2');

2、需求: 根据学生编号批量删除学生信息DROP PROCEDURE IF EXISTS `p_del_studentInfo_bySeqNo`;DELIMITER $$CREATE PROCEDURE p_del_studentInfo_bySeqNo(IN arrayStr VARCHAR(1000),IN sSplit VARCHAR(10))SQL SECURITY INVOKER #允许其他用户运行BEGIN DECLARE e_code INT DEFAULT 0;#初始化报错码为0 DECLARE result VARCHAR(256) CHARACTER set utf8;#初始化返回结果,解决中文乱码问题 DECLARE arrLength INT DEFAULT 0;/*定义数组长度*/ DECLARE arrString VARCHAR(1000);/*定义初始数组字符*/ DECLARE sStr VARCHAR(1000);/*定义初始字符*/ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e_code=1;#遇到错误后继续执行;(需要返回执行结果时用这个) START TRANSACTION;#启动事务 SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*获得数组长度*/ SET arrString = arrayStr; DROP TEMPORARY TABLE IF EXISTS list_tmp; create temporary table list_tmp(id VARCHAR(32));/*定义临时表*/ WHILE arrLength > 0 DO set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 得到分隔符前面的字符串 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 得到分隔符后面的字符串 set arrLength = arrLength -1; set @str = trim(sStr); insert into list_tmp(id) values(@str); END WHILE; IF row_count()=0 THEN SET e_code = 1; SET result = '请输入正确的参数'; END IF; set @count = (SELECT count(1) FROM t_students s,list_tmp t WHERE s.seq_no = t.id); IF @count >0 THEN DELETE FROM t_scores WHERE student_id in (SELECT s.student_id FROM t_students s,list_tmp t WHERE s.seq_no = t.id); DELETE FROM t_students WHERE student_id in (SELECT t.id FROM list_tmp t); ELSE SET e_code = 1; SET result = '该学生不存在!'; END IF; IF e_code=1 THEN ROLLBACK; #回滚 ELSE COMMIT; SET result = '该学生已被删除成功'; END IF; SELECT result; DROP TEMPORARY TABLE IF EXISTS list_tmp;END $$DELIMITER ;

说明:在创建存储过程的时候,传入了两个参数,第一个代表要传入的数组字符串形式,第二个参数为以什么分割字符串。

声明初始化变量DECLARE arrLength INT DEFAULT 0;/*定义数组长度*/DECLARE arrString VARCHAR(1000);/*定义初始数组字符*/DECLARE sStr VARCHAR(1000);/*定义初始字符*/

获取传入参数数组长度SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*获得数组长度*/SET arrString = arrayStr;/*赋值*/

创建临时表DROP TEMPORARY TABLE IF EXISTS list_tmp;create temporary table list_tmp(id VARCHAR(32));/*定义临时表*/

截取数组字符串并依次存入到临时表中供后面业务使用WHILE arrLength > 0 DO set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 得到分隔符前面的字符串 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 得到分隔符后面的字符串 set arrLength = arrLength -1; set @str = trim(sStr); insert into list_tmp(id) values(@str);END WHILE;

注: 存储过程结束时一定要记得删除临时表

不是非常复杂的业务没有必要用到存储过程的,本文不是引导大家一定要使用存储过程,只是让大家知道有这么一回事!

mysql 字段可以存数组吗_mysql怎么存数组相关推荐

  1. mysql字段代码是什么意思_mysql里面字段是什么意思?

    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...

  2. mysql 数组 分组_mysql分组查询数组

    mysql分组查询数组 - 技术改变生活 - 开源中国社区 首页 开源项目 Java 开源软件 C# 开源软件 PHP 开源软件 C/C++ 开源软件 Ruby 开源软件 Python 开源软件 Go ...

  3. mysql字段空的排后面_mysql oder by排序把null的字段放在最后面

    默认情况下,MySQL将null算作最小值. 使用: if(isnull(字段名),1,0) 说明:它的意思是将该字段根据是否为null值分成两部分,0相当于null值部分放在最后面,1相当于非nul ...

  4. mysql 数组查询_MySQL查询使用数组

    我正在尝试使用数组查询MySQL数据库,但是遇到了麻烦! 我有一个名为客户的表,我希望能够从"扇区"列等于$ sectorlink的所有行中选择"名称". 然后 ...

  5. mysql字段存数组

    mysql字段存数组 先将实体类的数组类型改为 private JSONArray  list: 然后使用typeHandler来修改存取的类型

  6. mysql字段的长度_MySQL字段的长度

    MySQL字段有多种的类型,不同的MySQL字段长度也各不一样,下面就为您介绍各种MySQL字段的长度,供您参考学习之用. 数值类型 列类型 需要的存储量 TINYINT 1 字节 SMALLINT ...

  7. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  8. mysql数据库字符类型长度_MySQL数据库入门:mysql字段每个类型长度大小与建表类型长度说明...

    本文主要向大家介绍了MySQL数据库入门的mysql字段每个类型长度大小与建表类型长度说明,希望对大家学习MySQL数据库入门有所帮助. 在创建数据库表时,例如create table user ( ...

  9. mysql 升级到集群_MySQL Yum存储库 安装、升级、集群

    添加MySQL Yum存储库 首先,将MySQL Yum存储库添加到系统的存储库列表中.按着这些次序: 选择并下载适用于您的平台的发行包. 使用以下命令安装下载的发行包,替换platform-and- ...

最新文章

  1. D - Triangle Partition HDU - 6300 sort(cmp)
  2. python安装不了jieba_python安装jieba失败怎么办?_后端开发
  3. 贫困地区农品产销对接行动倡议书-中国农民丰收节交易会
  4. 【ElasticSearch】ElasticSearch-SQL插件
  5. ASP.NET传统的三层架构
  6. div 隐藏_div的position属性
  7. python ansible模块_ansible常用模块
  8. linux下面的智能解压脚本smart解压
  9. 企业微信直播有哪些优势呢?
  10. 架构师之路 — 分布式系统 — 分布式网络分区难题
  11. 手机短信小额支付接口.Net实现
  12. python-decouple简介
  13. 数据结构与算法 -- 基础篇
  14. 【渝粤题库】陕西师范大学202861 发展心理学 作业(专升本)
  15. sql2000 sp3、sql2000 sp4升级补丁下载和安装须知
  16. java根据业务排序利用Comparator.comparing自定义排序规则
  17. 运筹学 —线性规划总结
  18. 如何使用Redis缓存 ?
  19. 匈牙利命名法(Hungarian)
  20. Unicode 索引表,编码表,编码范围

热门文章

  1. SpringBoot入门(二)——起步依赖
  2. (MYSQL学习笔记4)事务的开启、提交、回滚
  3. lvs keepalived
  4. cocos2dx - Lua 语言
  5. 在 Windows 7 下安装 Hyper-V manager
  6. MultipartEntity与UrlEncodedFormEntity区别
  7. 软件架构中的分层技术
  8. How to use tcpdump with examples
  9. fckeditor的jsp中的使用
  10. [原创]结构在Loadrunner中的应用