多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、MySQL ではストアド プロシージャに配列を直接渡す方法はありません。この場合、パラメータを文字列の形式で渡す方法をフォールバックまたは変更し、プロシージャ本体で文字列を配列に変換することしかできないのでしょうか?しかし、残念ながら、MySQL では文字列を配列に変換する関数を直接提供していません。今、誰かを殴りたい気分ですか?しかし、慌てる必要はありません。この道が塞がれても、別の道を選ぶことができます。必ず解決策はあります。受信した文字列を複数の文字に切り捨てて一時テーブルに渡し、カーソルを使用するか、テーブルを直接結合してデータをフィルタリングすることができます。これにより、後で望ましい効果が得られます。 これを実践するために例を見てみましょう。 1. インスタンスのデータベースを作成します。 データベース huafeng_db を作成します。 huafeng_db を使用します。 `huafeng_db`.`t_scores` が存在する場合はテーブルを削除します。 `huafeng_db`.`t_students` が存在する場合はテーブルを削除します。 `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, 主キー (`class_id`) )ENGINE=InnoDB デフォルト文字セット=utf8; `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('1', 'First Grade') を挿入します。 `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('2', '2年生') を挿入します。 `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('3', 'Grade Three') を挿入します。 `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('4', '4年生') を挿入します。 `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('5', '5年生') を挿入します。 `huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('6', 'Grade 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、 主キー (`student_id`)、 キー `class_id` (`class_id`), 制約 `t_students_ibfk_1` 外部キー (`class_id`) 参照 `t_class` (`class_id`) )ENGINE=InnoDB デフォルト文字セット=utf8; `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiaohong',0,1,'1') を挿入します。 `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiaoqing',0,2,'2') を挿入します。 `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiao Ming',1,3,'3') を挿入します。 `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiao Lan',0,4,'4') を挿入します。 `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に INSERT INTO VALUES('小米',1,5,'5'); `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, 主キー (`score_id`)、 キー `student_id` (`student_id`), 制約 `t_scores_ibfk_1` 外部キー (`student_id`) 参照 `t_students` (`student_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 デフォルト CHARSET=utf8; `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('1', 'Chinese', '90', '1') を挿入します。 `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('2', '数学', '97', '1') を挿入します。 `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('3', 'English', '95', '1') を挿入します。 `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('4', 'Chinese', '92', '2') を挿入します。 `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('5', '数学', '100', '2') を挿入します。 `t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('6', 'English', '98', '2') を挿入します。 2. 要件: 学生IDに従って学生情報を一括削除する `p_del_studentInfo_bySeqNo` が存在する場合はプロシージャを削除します。 区切り文字 $$ 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; 存在する場合は一時テーブルを削除します list_tmp; 一時テーブルを作成する list_tmp(id VARCHAR(32));/*一時テーブルを定義する*/ arrLength > 0 の場合 set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 区切り文字の前の文字列を取得します。 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 区切り文字の後の文字列を取得します。 set arrLength = arrLength -1; @str を trim(sStr) に設定します。 list_tmp(id) に values(@str) を挿入します。 END WHILE; row_count()=0の場合 e_code = 1 を設定します。 SET結果 = '正しいパラメータを入力してください'; 終了の場合; @count = (SELECT count(1) FROM t_students s,list_tmp t WHERE s.seq_no = t.id); を設定 @count > 0 THEN t_scores から student_id を削除します (SELECT s.student_id FROM t_students s,list_tmp t WHERE s.seq_no = t.id); t_students から削除 WHERE student_id in (SELECT t.id FROM list_tmp t); ELSE e_code = 1 を設定します。 SET結果 = '生徒が存在しません! '; END IF; e_code=1の場合 ROLLBACK; #ロールバックELSE 専念; SET result = '生徒は正常に削除されました'; 終了の場合; 結果を選択します。 存在する場合は一時テーブルを削除します list_tmp; 終了 $$ 区切り文字 ; 注: ストアド プロシージャを作成するときに、2 つのパラメーターが渡されます。最初のパラメーターは渡される配列文字列の形式を表し、2 番目のパラメーターは文字列を分割する方法です。 変数を宣言して初期化する DECLARE arrLength INT DEFAULT 0;/*配列の長さを定義する*/ DECLARE arrString VARCHAR(1000);/*配列の初期文字を定義します*/ DECLARE sStr VARCHAR(1000);/*最初の文字を定義する*/ 入力パラメータ配列の長さを取得する SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*配列の長さを取得します*/ SET arrString = arrayStr;/*代入*/ 一時テーブルの作成 存在する場合は一時テーブルを削除します list_tmp; 一時テーブルを作成する list_tmp(id VARCHAR(32));/*一時テーブルを定義する*/ 配列文字列をインターセプトし、後続のビジネス使用のために一時テーブルに保存します。 arrLength > 0 の場合 set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 区切り文字の前の文字列を取得します。 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 区切り文字の後の文字列を取得します。 set arrLength = arrLength -1; @str を trim(sStr) に設定します。 list_tmp(id) に values(@str) を挿入します。 終了しながら; 注意: ストアドプロシージャの最後には必ず一時テーブルを削除してください。 それほど複雑でないビジネスでは、ストアド プロシージャを使用する必要はありません。この記事は、すべての人にストアド プロシージャの使用法を教えるものではなく、ストアド プロシージャが存在することをすべての人に知ってもらうためのものです。 以下もご興味があるかもしれません:
|
>>: WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する
アプリケーションや Web サイトのパフォーマンスが成功の重要な要素であることは誰もが知っています。...
Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...
目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...
js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...
目次vue2の場合vue3ではセットアップに関する注意事項セットアップライフサイクルは、before...
目次I. 概要2. pt-archiverの主なパラメータ3. mysql_archiverのインス...
トリガー:トリガーの使用シナリオと対応するバージョン:トリガーは次の MySQL バージョンで使用で...
目次1. DOM の違い2. 同じレイヤーの同じタイプの要素にキー属性を追加する3. キーはインデッ...
序文Reduce() メソッドは関数を累積器として受け取り、配列内の各値 (左から右へ) が単一の値...
Grafana をインストールします。公式 Web サイトでは、直接インストールできる Ubuntu...
以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...
この記事は、2018 年 9 月 19 日に Adobe Systems Inc で開催された ...
Linuxでタイムゾーンを変更する場合、常に変更することはできませんAsia/Shanghai に変...
サーバーB(172.17.166.11)の電源がオンまたは再起動されると、サーバーA(172.17....
一般的に、Web ページの背景色は、より柔らかく、よりシンプルで、より明るく、暗いテキストとマッチし...