Méthode de tableau de stockage MySQL : interceptez d'abord la chaîne de tableau entrante en plusieurs caractères ; puis transférez-la vers une table temporaire ; enfin utilisez un curseur ou associez directement la table pour filtrer les données afin d'atteindre l'objectif de la matrice de stockage MySQL.
Le problème des fonctions faibles des procédures stockées MySQL a toujours été une préoccupation. Aujourd'hui, je vais parler de la solution au problème selon lequel les procédures stockées Mysql ne peuvent pas transmettre le tableau. paramètres de type.
Cours recommandé : Tutoriel MySQL.
Dans de nombreux cas, les tableaux sont souvent utilisés lors de l'écriture de procédures stockées, mais il n'existe aucun moyen de transmettre directement les paramètres des procédures stockées dans MySQL à un tableau. Dans ce cas, nous pouvons uniquement retirer ou transmettre les paramètres sous forme de chaîne d'une autre manière, puis convertir la chaîne en tableau dans le corps de la procédure ?
Mais je suis désolé de vous dire que mysql ne fournit pas directement de fonction pour convertir une chaîne en tableau. Maintenant, as-tu envie de frapper quelqu'un ? Cependant, pas de panique, cette route est barrée, prenons une autre route, il y a toujours une solution. Nous pouvons intercepter la chaîne entrante en plusieurs caractères et la transmettre dans la table temporaire, puis utiliser un curseur ou des tables directement liées pour filtrer les données. De cette façon, l’effet souhaité peut être obtenu plus tard.
Pratirons-le avec un exemple :
1. Créez une base de données par exemple :
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 Exigences : Supprimez les informations sur les étudiants par lots en fonction du nombre d'étudiants
.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 ;
Explication : lors de la création de la procédure stockée, deux paramètres sont transmis. Le premier représente la forme de chaîne de tableau à transmettre et le deuxième paramètre indique comment diviser la chaîne.
Déclarer les variables d'initialisation
DECLARE arrLength INT DEFAULT 0;/*定义数组长度*/ DECLARE arrString VARCHAR(1000);/*定义初始数组字符*/ DECLARE sStr VARCHAR(1000);/*定义初始字符*/
Obtenir la longueur du tableau de paramètres entrant
SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*获得数组长度*/ SET arrString = arrayStr;/*赋值*/
Créer une table temporaire
DROP TEMPORARY TABLE IF EXISTS list_tmp; create temporary table list_tmp(id VARCHAR(32));/*定义临时表*/
Intercepter la chaîne du tableau et la stocker dans la table temporaire dans l'ordre Pour une utilisation professionnelle ultérieure
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;
Remarque : assurez-vous de supprimer la table temporaire à la fin de la procédure stockée
Si l'entreprise n'est pas très complexe, il n'est pas nécessaire de l'utiliser la procédure stockée. Cet article n'est pas destiné à guider tout le monde dans son utilisation. La procédure stockée est simplement destinée à faire savoir à tout le monde qu'une telle chose existe !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!