2011-11-23 2 views
5

私はストアドプロシージャを初めて使用しています。 私の仕事は、まずテンポラリテーブルからデータを検証してメインテーブルにデータを挿入するストアドプロシージャを作成することです。 これは、tempテーブルの各行を繰り返し処理し、他のストアドプロシージャまたはユーザー定義関数を使用して検証し、そのデータをメインテーブルに挿入することを計画しています。MYSQLでカーソルを使用しないで反復する

私の問題は、非常に遅く、メモリを消費するので、CURSORSを使わずにテンポラリテーブルの行を繰り返し処理する方法です。私はCURSORの代わりにいくつかのループ構造を使いたいです。

もちろん、上記の問題のアルゴリズムが他にもある場合は、歓迎します。

PS:私は、カーソルを使用しないMYSQL DB

+2

... SELECT文 - http://dev.mysql.com/doc/refman/5.1/en/insert-select.html – Devart

+0

検証ルールとは何ですか/ cオデ?検証が大雑把かどうか、または検証が行に依存しないかどうかを知ることは不可欠です。 – Nonym

答えて

5

を使用しています、あなたは一時テーブルとWhile..Do文を使用して反復することができます。

はのは、以下のルーチンを作成し、検証プロセスを調整する2つのテーブル

CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

そして

CREATE TABLE `tmp_user` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

を持っているとしましょう:INSERTを見てみましょう

DELIMITER $$ 
USE `routines_sample`$$ 
CREATE PROCEDURE `nocursor`() 
BEGIN 
    Declare validId int; 
    Declare validName varchar(45); 

    -- drop the temporary table if exists 
    Drop table if exists `routines_sample`.tmp_validation; 
    -- create the temporary table, here you could use Engine=Memory 
    Create table `routines_sample`.tmp_validation (`id` int not null, `name` varchar(45) not null, `valid` bit(1) not null) Engine=MyISAM; 

    -- insert into the temporary table with a valid flag = 0 (false)  
    Insert into `routines_sample`.tmp_validation (`id`, `name`, `valid`) 
    Select tu.id, tu.name, 0 
    From `routines_sample`.tmp_user tu; 

    -- while exists data to validate on temporary table do something  
    While exists(Select `id` From `tmp_validation` Where `valid` = 0) Do 

    Select `id`, `name` Into @validId, @validName From tmp_validation Where `valid` = 0 Limit 1; 

    -- do your validation 
    Select @validId, @validName; 

    -- don't forget to update your validation table, otherwise you get an endless loop  
    Update `tmp_validation` 
    Set `valid` = 1 
    Where `id` = @validId; 

    END WHILE; 

    -- insert only valid rows to your destination table  
    Insert into `routines_sample`.`user` (`name`) 
    Select `name` From `tmp_validation` 
    Where `valid` = 1; 

    -- drop the temporary table  
    DROP TABLE tmp_validation; 

END$$ 

DELIMITER ; 
+0

ありがとう...私はこのような何かを探していた:) –

+0

それを聞いてよかった! @ RachitAgrawalあなたは答えを受け入れることができます:) – mbenegas

関連する問題