問題MySQLのカーソルを使用してストアドプロシージャ、複数の実行MySQLのカーソルループ複数の実行一度問題を解決するために

   問題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の

        違いを区別しながらMySQLを使用LOOPとMySQL MySQLの3つのループリサイクル法のREPEATサイクル

      マルチサイクル実行MySQLのカーソルの問題を解決するために、

 

 

公開された156元の記事 ウォンの賞賛159 ビュー490 000 +

おすすめ

転載: blog.csdn.net/HaHa_Sir/article/details/103390356