問題MySQLのカーソルを使用してストアドプロシージャ、複数の実行MySQLのカーソルループ複数の実行一度問題を解決するために
問題のI.説明
:1は、MySQLのストアドプロシージャを書き込むことで、問題に遭遇する、データを介してカーソルを使用するデータセットの1つの以上の実装に充填されたカーソルのカーソルループ。
2、発現は、このように明らかではない:、カーソルに充填されたとき10にSELECTクエリを、実際のループが11回実行されます。それは常にあるのn + 1回以上。
第二に、問題の再発します
図1に示すように、次のストアド・プロシージャ・pro_multi()は、2回実行されます。
DROP PROCEDURE IF EXISTS pro_multi ;
CREATE PROCEDURE pro_multi()
BEGIN
DECLARE count int DEFAULT 0 ; -- 定义 count 计数
DECLARE done int DEFAULT FALSE; -- 定义游标循环变量
DECLARE my_cursor CURSOR FOR( SELECT 1) ; -- 定义游标,获取到1条数据
DECLARE CONTINUE HANDLER FOR NOT FOUND set done = TRUE ; -- 游标循环结束时,将控制变量done = TRUE
OPEN my_cursor ; -- 打开游标
WHILE NOT done DO -- 开始循环
FETCH my_cursor INTO count ; -- 获取一行数据,赋值到自定义变量中
INSERT INTO `batch` (`id`,`name`, `age`) VALUES (UUID(),count, '0'); -- 插入数据
SET count = count + 1; -- 变量+1
END WHILE ; -- 结束循环
END ;
第三に、ポジショニングの問題
1、理由:通常のデータに初めてアクセス用のカーソル、データ取得二度目は、実装の最後に、データが存在しない、この時間は= TRUE、しかし、次のINSERT文を行ってますが、カーソルはまだ挿入し、最後に来たかわかりませんデータ。
図2に示すように、MySQLのカーソルループ、その結果、1つの以上の質問を実行します。
第四に、この問題は解決され
1、方法:インビトロサイクル、カーソルデータを取得します
DROP PROCEDURE IFはpro_multi_fix1をEXISTS。
PROCEDUREのpro_multi_fix1をCREATE()
ベギン
- 複数の実行の問題を解決するために
DECLAREカウントのint DEFAULT 0; - 定義された回数カウント
DECLAREは、int型のDEFAULT FALSEを行わ; - カーソルループ変数を定義します
DECLARE my_cursor CURSOR FOR(1 SELECT); - カーソルを定義、取得したデータ
サイクルの終わりにカーソル、制御変数が行わ= TRUE - ; DECLAREハンドラのためではないがTRUE =行う設定見つかり続けます。
OPEN my_cursor; - カーソルをオープン
my_cursor INTO数をFETCH; - 外側のループを、初めてデータ収集
WHILE DOを行っていない - サイクルを開始
INSERT INTO `batch`(` id`、 `NAME`、` age`)VALUES(UUID()、カウント、 '0'); - データ挿入
my_cursor INTO数をFETCH; - 再びデータを取得
SETカウント=カウント数+ 1; - 変数+1
ENDのWHILE; - サイクルの終わり
終わり ;
2.方法2:インビボサイクル、カーソルが端を増大させるために行われたか否かを判断します
DROP PROCEDURE IFはpro_multi_fix2をEXISTS。
PROCEDUREのpro_multi_fix2をCREATE()
ベギン
- 複数の実行時の問題を解決する(方法II)
DECLAREカウントのint DEFAULT 0; - 定義された回数カウント
DECLAREは、int型のDEFAULT FALSEを行わ; - カーソルループ変数を定義します
DECLARE my_cursor CURSOR FOR(1 SELECT); - カーソルを定義、取得したデータ
サイクルの終わりにカーソル、制御変数が行わ= TRUE - ; DECLAREハンドラのためではないがTRUE =行う設定見つかり続けます。
OPEN my_cursor; - カーソルをオープン
WHILE DOを行っていない - サイクルを開始
my_cursor INTO数をFETCH; - 再びデータを取得
IFは、その後行われていない - 決意増加を、カーソルループの後、データが挿入されていません
INSERT INTO `batch`(` id`、 `NAME`、` age`)VALUES(UUID()、カウント、 '0'); - データ挿入
END IF;
SETカウント=カウント数+ 1; - 変数+1
ENDのWHILE; - サイクルの終わり
終わり ;
----以上あります....
トリガーとトリガービューを作成するには、MySQLのデータ編集、削除トリガー
MySQLのストアドプロシージャは、学習、カーソルを使用して、入力および出力パラメータを整理します
MyBatisのは、ストアドプロシージャを呼び出す、MyBatisのは、関数呼び出しを使用するには
関数を作成MYSQL、MySQLが定義された関数は、ピンイン文字を実装MySQLのMySQLのピンイン文字列生成表音
違いを区別しながらMySQLを使用LOOPとMySQL MySQLの3つのループリサイクル法のREPEATサイクル
マルチサイクル実行MySQLのカーソルの問題を解決するために、