多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、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の起動に失敗する問題を解決する
MySql インデックスの詳細な紹介と正しい使用方法1. はじめに:インデックスはクエリ速度に重大な...
ソフトウェア バージョンとプラットフォーム: MySQL-5.7.17-winx64、win7 Ho...
序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...
目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...
1. はじめにここでは apollo について詳しく説明しません。公式サイト https://git...
この記事の例では、ストップウォッチタイマーを実装するためのJSの具体的なコードを参考までに共有してい...
1. ダウンロードしたファイルを以下のように解凍します。 。 2. 環境変数に解凍ディレクトリを追加...
1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...
1. コマンドの紹介ファイル コマンドは、ファイルの種類を識別するために使用されます。ファイル チェ...
01. コマンドの概要basename - ファイル名からディレクトリとサフィックスを削除しますba...
目次1. DIVとSPANの違いと特徴2. スパンタグの概要3. 拡大と改善4. 凡例の効果の実証例...
序文ご存知のとおり、ブラウザの相同性戦略とクロスドメイン方式も、フロントエンド面接で頻繁に遭遇する問...
問題の説明最近、ホストから次のカーネル情報が報告されました。 7月8日 10:47:42 cztes...
単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...
任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...