2011-11-23 10 views
5

Jestem nowy w procedurach przechowywanych. Moim zadaniem jest napisanie procedury składowanej, która najpierw sprawdzi dane w tabeli tymczasowej, a następnie wstawi dane do tabeli głównej. W tym celu planuję iterować po każdym wierszu tabeli tymczasowej, sprawdzać poprawność za pomocą innej procedury składowanej lub funkcji zdefiniowanej przez użytkownika, a następnie wstawić dane do tabeli głównej.Iterowanie bez użycia kursora w MYSQL

Mój problem polega na iteracji po wierszach tabeli tymczasowej bez użycia CURSORS, ponieważ są one bardzo wolne i zajmują dużo pamięci. Chcę użyć trochę struktury pętli zamiast CURSOR.

Oczywiście, jeśli ktoś ma jakikolwiek inny algorytm dla powyższego problemu, sugestie są mile widziane.

PS: Używam MYSQL DB

+2

Spójrz na INSERT ... Instrukcja SELECT - http://dev.mysql.com/doc/refman/5.1/en/insert-select.html – Devart

+0

Jaka zasada sprawdzania poprawności/c oda? Istotne byłoby, aby wiedzieć, czy walidacja jest pobieżna lub czy walidacja jest niezależna od wiersza. – Nonym

Odpowiedz

5

Bez użycia kursora, można iteracyjne użyciu tabeli tymczasowej oraz oświadczenie While..Do.

Powiedzmy masz dwie tabele

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

I

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

Tworzenie następujące rutynowe i dostosować proces weryfikacji:

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

dzięki ... szukałem czegoś takiego :) –

+0

Dobrze to słyszeć! @RachitAgrawal mógłbyś przyjąć odpowiedź :) – mbenegas

Powiązane problemy