Beim Schreiben gespeicherter Prozeduren werden häufig Arrays verwendet. In MySQL gibt es jedoch keine Methode, um Arrays direkt an gespeicherte Prozeduren zu übergeben. Können wir in diesem Fall nur auf die Methode zurückgreifen oder sie ändern, mit der die Parameter in Form von Zeichenfolgen übergeben werden, und die Zeichenfolgen dann im Prozedurkörper in Arrays konvertieren? Leider muss ich Ihnen mitteilen, dass MySQL keine direkte Funktion zum Konvertieren eines Strings in ein Array bereitstellt. Möchten Sie jetzt jemanden schlagen? Aber keine Panik. Wenn dieser Weg versperrt ist, können wir einen anderen nehmen. Es gibt immer eine Lösung. Wir können die eingehende Zeichenfolge in mehrere Zeichen kürzen und sie an eine temporäre Tabelle übergeben und dann einen Cursor verwenden oder die Tabelle direkt verbinden, um die Daten zu filtern. Dadurch wird später der gewünschte Effekt erzielt. Sehen wir uns ein Beispiel an, um dies in die Praxis umzusetzen: 1. Erstellen Sie eine Datenbank für die Instanz: DATENBANK ERSTELLEN huafeng_db; verwenden Sie huafeng_db; Tabelle löschen, wenn `huafeng_db`.`t_scores` vorhanden ist; Tabelle löschen, wenn `huafeng_db`.`t_students` vorhanden ist; Tabelle löschen, wenn `huafeng_db`.`t_class` vorhanden ist; TABELLE `huafeng_db`.`t_class` ERSTELLEN ( `class_id` int(11) NICHT NULL, `class_name` varchar(32) ZEICHENSATZ utf8 STANDARD NULL, PRIMÄRSCHLÜSSEL (`class_id`) )ENGINE=InnoDB STANDARD-CHARSET=utf8; INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('1', 'Erste Klasse'); INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('2', 'Zweite Klasse'); INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('3', 'Klasse drei'); INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('4', 'Vierte Klasse'); INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('5', 'Fünfte Klasse'); INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('6', 'Klasse 6'); TABELLE `t_students` ERSTELLEN ( `student_id` int(11) NICHT NULL AUTO_INCREMENT, `student_name` varchar(32) NICHT NULL, `sex` int(1) STANDARD NULL, `seq_no` int(11) STANDARD NULL, `class_id` int(11) NICHT NULL, PRIMÄRSCHLÜSSEL (`student_id`), SCHLÜSSEL `class_id` (`class_id`), EINSCHRÄNKUNG `t_students_ibfk_1` FREMDER SCHLÜSSEL (`class_id`) REFERENZEN `t_class` (`class_id`) )ENGINE=InnoDB STANDARD-CHARSET=utf8; INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Sequenznummer`,`Klassen-ID`) VALUES('Xiaohong',0,1,'1'); INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Sequenznummer`,`Klassen-ID`) VALUES('Xiaoqing',0,2,'2'); INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Sequenznummer`,`Klassen-ID`) VALUES('Xiao Ming',1,3,'3'); INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Sequenznummer`,`Klassen-ID`) VALUES('Xiao Lan',0,4,'4'); INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Seq-Nr.`,`Klassen-ID`) VALUES('Studentenname',1,5,'5'); INSERT INTO `huafeng_db`.`t_students`(`Studentenname`,`Geschlecht`,`Seq-Nr.`,`Klassen-ID`) VALUES('Studentenname',1,6,'6'); TABELLE `huafeng_db`.`t_scores` ERSTELLEN ( `score_id` int(11) NICHT NULL AUTO_INCREMENT, `course_name` varchar(64) STANDARD NULL, `score` double(3,2) STANDARD NULL, `student_id` int(11) STANDARD NULL, PRIMÄRSCHLÜSSEL (`score_id`), SCHLÜSSEL `student_id` (`student_id`), EINSCHRÄNKUNG `t_scores_ibfk_1` FREMDER SCHLÜSSEL (`student_id`) REFERENZEN `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', 'Chinesisch', '90', '1'); INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('2', 'Wert', '97', '1'); INSERT INTO `t_scores` (`score_id`, `Kursname`, `Punktzahl`, `Studenten-ID`) VALUES ('3', 'Englisch', '95', '1'); INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('4', 'Chinesisch', '92', '2'); INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('5', '5', '100', '2'); INSERT INTO `t_scores` (`score_id`, `Kursname`, `Punktzahl`, `Studenten-ID`) VALUES ('6', 'Englisch', '98', '2'); 2. Anforderung: Stapelweises Löschen von Studenteninformationen gemäß Studentenausweis DROP-VERFAHREN, WENN EXISTIERT `p_del_studentInfo_bySeqNo`; TRENNUNGSZEICHEN $$ PROZEDUR ERSTELLEN p_del_studentInfo_bySeqNo(IN arrayStr VARCHAR(1000),IN sSplit VARCHAR(10)) SQL SECURITY INVOKER #Anderen Benutzern das Ausführen erlauben BEGIN DECLARE e_code INT DEFAULT 0; #Den Fehlercode auf 0 initialisieren DECLARE result VARCHAR(256) CHARACTER set utf8; #Initialisiere das zurückgegebene Ergebnis, um das chinesische verstümmelte Problem zu lösen DECLARE arrLength INT DEFAULT 0; /*Definiere die Array-Länge*/ DECLARE arrString VARCHAR(1000);/*definiere das anfängliche Array-Zeichen*/ DECLARE sStr VARCHAR(1000);/*definiere das Anfangszeichen*/ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e_code=1;#Ausführung nach Auftreten eines Fehlers fortsetzen; (verwenden Sie dies, wenn Sie das Ausführungsergebnis zurückgeben müssen) START TRANSACTION;#Transaktion starten SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*Array-Länge abrufen*/ SET arrString = arrayStr; Temporäre Tabelle löschen, falls vorhanden, list_tmp; Temporäre Tabelle erstellen list_tmp(id VARCHAR(32));/*Temporäre Tabelle definieren*/ WHILE arrLength > 0 DO set sStr = substr(arrString,1,instr(arrString,sSplit)-1); – Ruft die Zeichenfolge vor dem Trennzeichen ab set arrString = substr(arrString,length(sString)+length(sSplit)+1); – Ruft die Zeichenfolge nach dem Trennzeichen ab set arrLength = arrLength -1; setze @str = trim(sStr); in list_tmp(id) Werte(@str) einfügen; ENDE WÄHREND; WENN row_count()=0 DANN Setzen Sie den E-Code auf 1. SET-Ergebnis = „Bitte geben Sie die korrekten Parameter ein“; ENDE, WENN; setze @count = (SELECT count(1) FROM t_students s,list_tmp t WHERE s.seq_no = t.id); WENN @count > 0 DANN LÖSCHEN AUS t_scores, WO student_id in (WÄHLEN s.student_id AUS t_students s,list_tmp t, WO s.seq_no = t.id); LÖSCHEN AUS t_students, WO student_id in (WÄHLEN Sie t.id AUS list_tmp t); SONST Setzen Sie den E-Code auf 1. SET-Ergebnis = 'Der Student existiert nicht! '; ENDE WENN; WENN e_code=1 DANN ROLLBACK; #Rollback SONST BEGEHEN; SET-Ergebnis = „Der Student wurde erfolgreich gelöscht“; ENDE, WENN; SELECT-Ergebnis; Temporäre Tabelle löschen, falls vorhanden, list_tmp; ENDE $$ TRENNUNGSZEICHEN ; Hinweis: Beim Erstellen einer gespeicherten Prozedur werden zwei Parameter übergeben. Der erste Parameter stellt das zu übergebende Array-String-Format dar und der zweite Parameter ist die Methode, mit der der String aufgeteilt wird. Deklarieren und Initialisieren von Variablen DECLARE arrLength INT DEFAULT 0;/*Arraylänge definieren*/ DECLARE arrString VARCHAR(1000);/*definiere das anfängliche Array-Zeichen*/ DECLARE sStr VARCHAR(1000);/*definiere das Anfangszeichen*/ Holen Sie sich die Länge des eingehenden Parameter-Arrays SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*Arraylänge abrufen*/ SET arrString = arrayStr;/*Zuweisung*/ Erstellen einer temporären Tabelle Temporäre Tabelle löschen, falls vorhanden, temporäre Liste; Temporäre Tabelle erstellen list_tmp(id VARCHAR(32));/*Temporäre Tabelle definieren*/ Fangen Sie die Array-Zeichenfolge ab und speichern Sie sie in einer temporären Tabelle zur späteren geschäftlichen Verwendung WHILE arrLength > 0 DO set sStr = substr(arrString,1,instr(arrString,sSplit)-1); – Ruft die Zeichenfolge vor dem Trennzeichen ab set arrString = substr(arrString,length(sString)+length(sSplit)+1); – Ruft die Zeichenfolge nach dem Trennzeichen ab set arrLength = arrLength -1; setze @str = trim(sStr); in list_tmp(id) Werte(@str) einfügen; ENDE WÄHREND; Hinweis: Vergessen Sie nicht, die temporäre Tabelle am Ende der gespeicherten Prozedur zu löschen. Für Unternehmen, die nicht sehr komplex sind, besteht keine Notwendigkeit, gespeicherte Prozeduren zu verwenden. Dieser Artikel führt nicht jeden zur Verwendung gespeicherter Prozeduren an, sondern lässt nur alle wissen, dass es so etwas gibt! Das könnte Sie auch interessieren:
|
<<: Beispielcode für die Vue-Bildzuschneidekomponente
>>: Lösen Sie das Problem des Startfehlers von PHPStudy MySQL unter Windows
Bei der Verwendung von lepus3.7 zur Überwachung d...
Mittlerweile basieren die meisten Docker-Images a...
Der Fehler „mysql ist kein interner Befehl“ tritt...
Inhaltsverzeichnis Vorwort: 1. Gründe für die Ere...
Bei der Verwendung von MySQL zum Ausführen bestim...
Vorwort Bei der Arbeit muss ich jede Woche die vo...
Vorwort Der Autor war schon immer der Meinung, da...
Inhaltsverzeichnis Linux MySQL 5.5 auf MySQL 5.7 ...
ZeicheneffekteImplementierungscode JavaScript var...
Dieser Artikel beschreibt, wie man OpenCV mit C++...
[Problembeschreibung] Auf der Anwendungsseite wir...
Im aktuellen Projekt müssen wir einen Effekt zum ...
Wenn wir Code schreiben, müssen wir oft die Unter...
1. Laden Sie das neueste Nginx-Docker-Image herun...
React Hooks ist eine neue Funktion, die in React ...